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

Unit test multiple calls that "MustHaveHappenedOnceExactly"

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

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: Argument matcher <p => (p.Length> == 2)> threw an exception. See inner exception for details. ---> System.NullReferenceException: Object reference not set to an instance of an object.

我假设 MustHaveHappenedOnceExactly 使用定义的匹配项检查对 Foo 的所有调用,因此当不带参数调用 Foo 时第二个匹配项会引发异常。我怎样才能避免该异常并仍然测试 Foo 使用特定参数被调用一次?

重构匹配器以适应空值,即 .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()
);