FakeItEasy:重置假电话历史/忽略电话

FakeItEasy: Reset Fake Calls History / Ignore Call

我想重置虚假来电历史记录或忽略来电。

在测试的 class 构造函数的 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
    }
}

我觉得这不对。通常我希望对象创建的成本是对该对象的测试预期的一部分。显然,这取决于你的 AssertedMethod 做了什么,但是,如果你的构造函数没有调用它,你的测试真的仍然有效吗?您的 SUT 是否处于 class 需要的预期状态?

我在 fakeiteasy 框架中看不到任何允许您重置计数的内容,尽管正如我所说的那样,这似乎不是正确的做法,所以我并不是真的希望找到它。这似乎是实现您似乎想要做的事情的一种简单方法,同时仍然至少在 TestClass 级别上承认您知道 constructor/init 中有一个调用是这样的:

const int InitAssertedMethodCalls = 1;

[TestMethod]
public void TestMethod1()
{
    sut.TestedMethod(); 
    A.CallTo(() => myFakedObject.AssertedMethod())
             .MustHaveHappened(Repeated.Exactly.Times(1 + InitAssertedMethodCalls )); 
}

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

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

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

Fake.ClearRecordedCalls(fake);

2.0.0 ≤ FakeItEasy version < 3.2.0时,考虑forsvarir的减法().

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);
    }
}

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

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