gpt4 book ai didi

c# - 我可以将起订量的 InSequence() 与 MockBehavior.Loose 一起使用吗?

转载 作者:太空狗 更新时间:2023-10-29 17:49:48 24 4
gpt4 key购买 nike

我试图执行后续调用验证,我发现 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 版本是 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# - 我可以将起订量的 InSequence() 与 MockBehavior.Loose 一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9172811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com