繁体   English   中英

FakeItEasy断言方法调用方法

[英]FakeItEasy assert that method call to method

我有一个用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时 ,代码抛出异常,说:

呼叫被发现但呼叫中的呼叫顺序不正确

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

或者,测试此案例的正确方法是什么?

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();

更新:这是一个错误,并已修复。 FakeItEasy 5.1.1开始 ,行为将恢复到2.2.0中的状态


我们记录了呼叫完成的呼叫,因此在您的情况下,订单将是

  • 执行方法A.
  • 执行methodB
  • 记录方法B发生的情况
  • 记录方法A发生的情况

但是,在3.4.2中,我们发布了对设置ref参数值的修复, 屏蔽了用于验证调用的传入参数值 这在移动,我们从内记录呼叫的“序列号”的地步CastleInvocationCallAdapterFakeManager 前者将已经录制methodA调用之前的调用methodB

这打破了你的用例是一种耻辱。 我认为新行为是一个错误,并创建了问题#1583 - 在应用最佳规则后记录呼叫,而不是在GitHub上收到

但就个人而言,我会看一下测试(我认为这比你在这里提到的更复杂)。 我会接受@ Nikosi的建议,而不是检查电话的顺序。 知道他们都被称为(甚至只是methodB叫)可能就足够了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM