最佳答案
设置如下:
public interface IFoo
{
void Fizz();
}
[Test]
public void A()
{
var foo = new Mock<IFoo>(MockBehavior.Loose);
foo.Object.Fizz();
foo.Verify(x => x.Fizz());
// stuff here
foo.Verify(x => x.Fizz(), Times.Never()); // currently this fails
}
基本上,我想输入一些代码在 // stuff here
使 foo.Verify(x => x.Fizz(), Times.Never())
通过。
因为这可能构成了 moq/单元测试的滥用,所以我的理由是,我可以这样做:
[Test]
public void Justification()
{
var foo = new Mock<IFoo>(MockBehavior.Loose);
foo.Setup(x => x.Fizz());
var objectUnderTest = new ObjectUnderTest(foo.Object);
objectUnderTest.DoStuffToPushIntoState1(); // this is various lines of code and setup
foo.Verify(x => x.Fizz());
// reset the verification here
objectUnderTest.DoStuffToPushIntoState2(); // more lines of code
foo.Verify(x => x.Fizz(), Times.Never());
}
基本上,我有一个状态对象,在这个状态对象中,需要进行大量工作(包括创建各种模拟对象和其他调整) ,才能将其推送到 State1中。然后我想测试从 State1到 State2的转换。与复制或抽象代码相比,我更愿意重用 State1测试,将其推入 State2并执行 Asserts ——除了验证调用之外,所有这些我都可以做。