首页 > 解决方案 > FakeItEasy 断言方法调用方法

问题描述

我有一个用FakeItEasy v2.2.0编写的单元测试。

测试测试一个方法,让它MethodA调用MethodB.

简单的类:

public class Foo
{
    public virtual void MethodA()
    {
        MethodB();
    }

    public virtual void MethodB() { }
}

简单的测试:

var foo_fake = A.Fake<Foo>(options => options.CallsBaseMethods());

foo_fake.MethodA();

A.CallTo(() => foo_fake.MethodA()).MustHaveHappened()
    .Then(A.CallTo(() => foo_fake.MethodB()).MustHaveHappened());

使用FakeItEasy 2.2.0,代码通过了。

但是当我们升级到5.1.0时,代码抛出异常:

已找到呼叫,但呼叫中的顺序不正确

当我们说方法被调用时?在执行开始时,还是在结束时?

或者,测试这种情况的正确方法是什么?

标签: c#unit-testingfakeiteasy

解决方案


调用MethodB发生并在完成之前MethodA完成。这解释了订单消息。它(FakeItEasy)记录在成员调用结束时调用。

为了证明我的观点,以下测试通过

A.CallTo(() => foo_fake.MethodB()).MustHaveHappened() //<-- Note MethodB checked first
    .Then(A.CallTo(() => foo_fake.MethodA()).MustHaveHappened());

我建议以下

//Arrange
var foo_fake = A.Fake<Foo>(options => options.CallsBaseMethods());
Action<Foo> subject = foo => foo.MethodA();

//Act
subject(foo_fake);

//Assert
A.CallTo(() => foo_fake.MethodA()).MustHaveHappened();
A.CallTo(() => foo_fake.MethodB()).MustHaveHappened();

推荐阅读