我想重设虚假通话记录或忽略通话。

伪断言的方法在经过测试的类构造函数的Init方法中调用,并且我想忽略此调用,因为它不是经过测试的 Action 的一部分。

这里有个例子:

[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
    }
}

最佳答案

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

但是,如果您确实需要这样做:

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

Fake.ClearRecordedCalls(fake);

2.0.0≤FakeItEasy版本时,请考虑forsvarir的减法(FakeItEasy: Reset Fake Calls History / Ignore Call)。

FakeItEasy版本时,可以使用范围:
[Test]
public void TestMethod1()
{
    using (Fake.CreateScope())
    {
        sut.TestedMethod(); // calls myFakedObject.AssertedMethod() again
        A.CallTo(() => myFakedObject.AssertedMethod())
         .MustHaveHappened(Repeated.Exactly.Once);
    }
}

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

如果想将TestInitialize保留在所有测试方法之外,还可以在TestCleanup中创建范围,并在using方法中进行处理。

08-16 02:31