【问题标题】:FakeItEasy: Reset Fake Calls History / Ignore CallFakeItEasy:重置假电话历史记录/忽略电话
【发布时间】:2015-05-19 15:23:25
【问题描述】:

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

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

【问题讨论】:

    标签: c# unit-testing mocking fakeiteasy


    【解决方案1】:

    我喜欢@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 仅查看在范围内进行的调用。

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

    【讨论】:

    • 有人知道怎么做这件事给我留下了深刻的印象,然后我发现是你@Blair Conrad!不过还是有点印象。
    【解决方案2】:

    这对我来说是错误的。通常,我希望创建对象的成本是对该对象的测试期望的一部分。显然,这取决于你的 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 )); 
    }
    

    【讨论】:

    • 感谢@forsvarir。在我的情况下,即使构造函数没有调用 assertedMethod,测试仍然有效,但我同意你的观点。
    猜你喜欢
    • 2011-09-07
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多