对“ MustHaveHappenedOnceExactly”的多个调用进行单元测试

时间:2019-01-02 11:13:26

标签: c# unit-testing fakeiteasy

我想验证我测试的方法使用不同的参数多次调用服务。服务方法具有一个必需参数和一个可选参数:

public void Foo(object o1, object[] o2 = null);

我期望Foo被调用2次,一次不使用,一次使用可选参数。可选参数应与条件匹配。为了测试这一点,我使用了FakeItEasy中的MustHaveHappenedOnceExactly

A.CallTo(() => testee.Method(A<object>.That.IsNotNull(), A<object[]>.That.IsNull()))
.MustHaveHappenedOnceExactly().Then(
A.CallTo(() => testee.Method(A<object>.That.IsNotNull(), A<object[]>.That.Matches(p => p.Length == 2)))
.MustHaveHappenedOnceExactly());

我得到的是以下异常:

  

FakeItEasy.UserCallbackException:参数匹配器

(p.Length> == 2)>引发了异常。有关详细信息,请参见内部异常。 ---> System.NullReferenceException:对象引用未设置为对象的实例。

我假设MustHaveHappenedOnceExactly检查具有定义的匹配项的Foo上的所有调用,因此,在没有参数的情况下调用Foo时,第二个匹配项将引发异常。如何避免该异常并仍然测试Foo是否使用特定参数被调用过一次?

1 个答案:

答案 0 :(得分:1)

重构匹配器以适应空值,即.Matches(p => p != null && p.Length == 2)

A.CallTo(() => testee.Method(
                    A<object>.That.IsNotNull(),
                    A<object[]>.That.IsNull()
                )
).MustHaveHappenedOnceExactly()
.Then(A.CallTo(() => testee.Method(
                        A<object>.That.IsNotNull(), 
                        A<object[]>.That.Matches(p => p != null && p.Length == 2) //<--
                    )
              ).MustHaveHappenedOnceExactly()
);