FakeItEasy:重置虚假呼叫历史记录/忽略呼叫

max*_*e51 5 c# unit-testing mocking fakeiteasy

我想重置虚假呼叫历史记录或忽略呼叫.

在测试类构造函数的Init方法中调用伪断言方法,我想忽略此调用,因为它不是测试操作的一部分.

这是一个例子:

[TestClass]
public class UnitTest1
{
    private MyFakedClass myFakedObject;
    private SUT sut;

    [TestInitialize]
    public void Init()
    {
        myFakedObject = A.Fake<MyFakedClass>();
        sut = new SUT(myFakedObject); //constructor calls myFakedObject.AssertedMethod()
    }

    [TestMethod]
    public void TestMethod1()
    {
        sut.TestedMethod(); //TestedMethod calls myFakedObject.AssertedMethod() again...
        A.CallTo(() => myFakedObject.AssertedMethod()).MustHaveHappened(Repeated.Exactly.Once); 
//...So this is false
    }
}
Run Code Online (Sandbox Code Playgroud)

Bla*_*rad 8

我喜欢@ forsvarir的回答.我倾向于认为构造函数中的调用很重要.

但是,如果你真的需要这样做:

FakeItEasy版本≥3.2.0时,您可以使用ClearRecordedCalls:

Fake.ClearRecordedCalls(fake);
Run Code Online (Sandbox Code Playgroud)

2.0.0≤FakeItEasy版本<3.2.0时,请考虑forsvarir的减法方法(FakeItEasy:重置虚假呼叫历史记录/忽略呼叫).

FakeItEasy版本<2.0.0时,您可以使用范围:

[Test]
public void TestMethod1()
{
    using (Fake.CreateScope())
    {
        sut.TestedMethod(); // calls myFakedObject.AssertedMethod() again
        A.CallTo(() => myFakedObject.AssertedMethod())
         .MustHaveHappened(Repeated.Exactly.Once);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用范围会导致MustHaveHappened仅查看范围内的调用.

如果您想保留所有测试方法的外部,TestInitialize也可以在TestCleanup方法中创建范围并将其处理using.