我试图执行后续的调用验证,我发现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>()));然而,这似乎只有在我将mock behavior指定为"strict“时才能起作用,这禁止我在mock对象上调用额外的方法。然而,我希望能够在这些对象上调用其他方法,我只希望这些调用是按顺序执行的。
有没有什么“支持”的方法(而不是求助于.Callback()和手工实现)?我发现了一个名为moq.sequence的附加库,然而,预编译的版本不能与最新的Moq一起工作。
发布于 2012-02-15 16:26:14
好的,我自己调查了这个案例,在SVN浏览器中深入研究了moq的源代码(只是为了记录-有问题的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()就开始起作用了。否则,将执行默认实现。因为对于严格的模拟,默认实现是抛出异常(调用被视为未指定的),所以整个解决方案都是有效的。
因此,使用松散的mock来获得当前的解决方案似乎是相当麻烦的。我将坚持使用基于Callback()的自制解决方案(顺便说一句,它可以被很好地包装)-它剥夺了将回调用于其他方式的能力,然而,我无论如何都没有使用它。
我张贴这个答案是希望它是有用的。
https://stackoverflow.com/questions/9172811
复制相似问题