我想重置虚假来电记录或忽略来电。
在测试类构造函数的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
}
}
答案 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 ));
}