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
方法中处理它。
我想重置虚假来电历史记录或忽略来电。
在测试的 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
方法中处理它。