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

时间:2015-03-17 09:05:42

标签: 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
    }
}

2 个答案:

答案 0 :(得分:8)

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

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

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

Fake.ClearRecordedCalls(fake);

2.0.0≤FakeItEasy版本&lt; 3.2.0 ,考虑forsvarir的减法方法(FakeItEasy: Reset Fake Calls History / Ignore Call)。

FakeItEasy版本&lt; 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仅查看范围内的调用。

如果您希望将TestInitialize保留在所有测试方法之外,您还可以在TestCleanup中创建范围并将其置于using方法中。

答案 1 :(得分:3)

这对我来说是错误的。通常我会期望对象创建的成本是该对象的测试期望的一部分。显然,这取决于你AssertedMethod的作用,但是,如果你的构造函数没有调用它,你的测试是否仍然有效?你的SUT会处于你班级所需的预期状态吗?

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

const int InitAssertedMethodCalls = 1;

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