首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在MockBehavior.Loose中使用moq的InSequence()吗?

我可以在MockBehavior.Loose中使用moq的InSequence()吗?
EN

Stack Overflow用户
提问于 2012-02-07 16:03:45
回答 1查看 3.2K关注 0票数 9

我试图执行后续的调用验证,我发现moq支持InSequence()方法,例如:

代码语言:javascript
复制
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一起工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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()方法的。

因此,实际上,以下代码:

代码语言:javascript
复制
validator.InSequence(s).Setup(m => m.IsValid(It.IsAny<Frame>())).Returns(true);

结果如下所示:

代码语言:javascript
复制
validator.When(/* call is made in sequence */).Setup(m => m.IsValid(It.IsAny<Frame>())).Returns(true);

换句话说,这只是设置一个条件行为--当按顺序调用该方法时,指定的Setup()就开始起作用了。否则,将执行默认实现。因为对于严格的模拟,默认实现是抛出异常(调用被视为未指定的),所以整个解决方案都是有效的。

因此,使用松散的mock来获得当前的解决方案似乎是相当麻烦的。我将坚持使用基于Callback()的自制解决方案(顺便说一句,它可以被很好地包装)-它剥夺了将回调用于其他方式的能力,然而,我无论如何都没有使用它。

我张贴这个答案是希望它是有用的。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9172811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档