我正在使用Moq与方法接口配对.我需要测试这个接口中的方法是按照一定的顺序执行的,也是每个方法执行一定次数的.
接口
public interface IInterface { void MethodOne(string foo); void MethodTwo(string foo); }
// MyClass stuff ... public async Task Run() { MethodOne("foo"); MethodTwo("foo"); } // ...
测试
[TestMethod] public async Task Test() { var mock = new Mock<IInterface>(); var mockSequence = new MockSequence(); var obj = new MyClass(); await obj.Run(); mock.Verify(i=> i.MethodOne("foo"),Times.Once()); mock.Verify(i=> i.MethodTwo("foo"),Times.Once()); }
这很好……
我已经尝试过这些测试来确定某个序列是否得到了适当的满足,但测试似乎总是通过.
[TestMethod] public async Task Test() { var mock = new Mock<IInterface>(); var mockSequence = new MockSequence(); var obj = new MyClass(); await obj.Run(); mock.InSequence(mockSequence).Setup(i => i.MethodOne("foo")); mock.InSequence(mockSequence).Setup(i => i.MethodTwo("foo")); }
应该通过,并做…
[TestMethod] public async Task Test() { var mock = new Mock<IInterface>(); var mockSequence = new MockSequence(); var obj = new MyClass(); await obj.Run(); mock.InSequence(mockSequence).Setup(i => i.MethodTwo("foo")); // swapped order here mock.InSequence(mockSequence).Setup(i => i.MethodOne("foo")); }
不应该通过,但确实……
>我需要做些什么来验证是否符合正确的顺序?
>我如何将两者结合起来,以便我可以测试执行次数和正确的顺序?
解决方法
这可能是你想要去的主题,但
NSubstitute是一个很好的模拟库,可以很好地处理这个问题.
在NSubstitute它只是:
在NSubstitute它只是:
var mock = Substitute.For<IInterface>(); var obj = new MyClass(); await obj.Run(); Received.InOrder(() => { mock.MethodOne("foo"); mock.MethodTwo("foo"); });