FakeItEasy断言对方法的方法调用

时间:2019-04-14 13:42:27

标签: c# unit-testing 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 时,代码会抛出异常:

  

找到了呼叫,但呼叫之间的顺序不正确

当我们说该方法称为时?在执行开始时还是结束时?

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

2 个答案:

答案 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中的状态


我们记录通话结束后 进行了通话,因此在您的情况下,顺序为

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

但是,在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)就足够了。