我有一个用 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 时,代码会抛出异常:
找到了呼叫,但呼叫之间的顺序不正确
当我们说该方法称为时?在执行开始时还是结束时?
或者,测试此案的正确方法是什么?
答案 0 :(得分:2)
对' insert this code into Class1
Public Sub FriendsList(oList As ListBox)
Dim a As Long
Dim friends(5) As String
friends(0) = "Anna"
friends(1) = "Mona"
friends(2) = "Marie"
friends(3) = "Kent"
friends(4) = "Jona"
friends(5) = "Fatima"
oList.Clear
For a = LBound(friends) To UBound(friends)
oList.AddItem friends(a)
Next a
End Sub
' insert this code into form
Private Sub Command1_Click()
Dim oFriends As Class1
Set oFriends = New Class1
oFriends.FriendsList List1 ' instead of List1, type the actual name of ListBox control
Set oFriends = Nothing
End Sub
的调用在MethodB
完成之前发生并完成。其中说明了订单消息。它(FakeItEasy)记录在成员调用结束时调用的内容。
为了证明我的观点,经过测试,以下通过
MethodA
我建议以下内容
A.CallTo(() => foo_fake.MethodB()).MustHaveHappened() //<-- Note MethodB checked first
.Then(A.CallTo(() => foo_fake.MethodA()).MustHaveHappened());
答案 1 :(得分:2)
更新:这是一个错误,已得到修复。从FakeItEasy 5.1.1开始,该行为已还原到2.2.0中的状态
我们记录通话结束后 进行了通话,因此在您的情况下,顺序为
但是,在3.4.2中,我们发布了对Setting ref argument values masks incoming argument values used to verify calls的修复。这将记录通话的“序列号”的位置从CastleInvocationCallAdapter
移到了FakeManager
。前者在调用methodA
之前会记录methodB
的调用。
这很遗憾,破坏了您的用例。我认为新行为是一个错误,并在GitHub上创建了问题#1583 - Calls are recorded after applying the best rule, not when received。
不过,就个人而言,我将看一下测试(我认为比您在此处介绍的测试要复杂得多)。我会接受@Nikosi的建议,而不检查电话的顺序。知道它们都被调用(甚至只是被调用methodB
)就足够了。