[英]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中的状态
我们记录了呼叫完成后的呼叫,因此在您的情况下,订单将是
但是,在3.4.2中,我们发布了对设置ref参数值的修复, 屏蔽了用于验证调用的传入参数值 。 这在移动,我们从内记录呼叫的“序列号”的地步CastleInvocationCallAdapter
到FakeManager
。 前者将已经录制methodA
调用之前的调用methodB
。
这打破了你的用例是一种耻辱。 我认为新行为是一个错误,并创建了问题#1583 - 在应用最佳规则后记录呼叫,而不是在GitHub上收到 。
但就个人而言,我会看一下测试(我认为这比你在这里提到的更复杂)。 我会接受@ Nikosi的建议,而不是检查电话的顺序。 知道他们都被称为(甚至只是methodB
叫)可能就足够了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.