我试图执行后续的调用验证,但我发现moq为此支持InSequence()方法,例如:
MockSequence s = new MockSequence();
validator.InSequence(s).Setup(m => m.IsValid(It.IsAny<Frame>())).Returns(true);
encryptor.InSequence(s).Setup(m=>m.Encrypt(It.IsAny<Frame>()));
socket.InSequence(s).Setup(m => m.Send(It.IsAny<Frame>()));
compressor.InSequence(s).Setup(m => m.Compress(It.IsAny<Frame>()));
但是,这似乎仅在将模拟行为指定为“严格”时才有效,这禁止我在模拟对象上调用其他方法。但是,我希望能够在这些对象上调用其他方法,我只想按顺序执行这些调用。
是否有任何“受支持的”方式(而不是诉诸.Callback()和手工实现)?我发现了另一个名为moq.sequence的库,但是,预编译的版本不适用于最新的Moq。
最佳答案
好的,我本人通过在SVN浏览器中挖掘Moq的源代码来亲自调查此案(仅作记录-所涉及的最小起订量为 Moq.4.0.10827.Final )。
我的调查导致我:
http://code.google.com/p/moq/source/browse/trunk/Source/MockSequence.cs?spec=svn751&r=712
通过查看InSequence()方法,我现在可以看到整个实现都基于When()方法。
因此,实际上,以下代码:
validator.InSequence(s).Setup(m => m.IsValid(It.IsAny<Frame>())).Returns(true);
最终像这样:
validator.When(/* call is made in sequence */).Setup(m => m.IsValid(It.IsAny<Frame>())).Returns(true);
换句话说,这只是建立条件行为-依次调用该方法时,指定的Setup()起作用。否则,将执行默认实现。而且由于严格的模拟,默认实现是抛出异常(该调用被视为未指定),因此整个解决方案都可以工作。
因此,获得用于松散模拟的最新解决方案似乎很麻烦。我只是坚持基于Callback()的自制解决方案(顺便说一句,它可以很好地包装)-它剥夺了将回调用于其他方式的能力,但是,我还是没有使用它。
我发布此答案,希望它有用。
关于c# - 我可以将Moq的InSequence()与MockBehavior.Loose一起使用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9172811/