对 "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()
);
我想验证我测试的方法是否使用不同的参数多次调用服务。服务方法有一个必需的和一个可选的参数:
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()
);