我有一个用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时,代码会抛出如下异常:
呼叫被找到,但在呼叫中没有按正确的顺序排列。
当我们说时,这个方法叫做?在行刑开始的时候还是在最后?
或者,怎样才是检验这个案子的正确方法?
发布于 2019-04-14 16:16:59
更新:这是一个错误,并且已经修复。从 FakeItEasy 5.1.1开始,这种行为已恢复到2.2.0中的状态。
我们记录下呼叫是在呼叫结束后发出的,所以在您的情况下,命令是
但是,在3.4.2中,我们向设置ref参数值掩盖用于验证调用的传入参数值。发布了修复程序。这将记录调用的“序列号”的点从CastleInvocationCallAdapter内移到FakeManager。前者会在调用methodA之前记录methodB的调用。
很遗憾这破坏了你的用例。我认为这种新的行为是一个错误,并在GitHub上创建了问题GitHub。
不过,就我个人而言,我会看一下测试(我认为测试比您在这里介绍的要复杂)。我会接受@Nikosi的建议,而不检查电话的顺序。知道它们都被调用(甚至仅仅是methodB被调用)可能就足够了。
发布于 2019-04-14 15:32:31
对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();https://stackoverflow.com/questions/55675942
复制相似问题