Модульное тестирование нескольких вызовов, которые "MustHaveHappenedOnceExactly" - PullRequest
0 голосов
/ 02 января 2019

Я хочу убедиться, что метод, который я тестирую, вызывает службу несколько раз с разными аргументами. У метода service есть обязательный и необязательный аргумент:

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

Я ожидаю, что Foo будет вызван 2 раза, один раз без и один раз с необязательным параметром. Необязательный параметр должен соответствовать критерию. Чтобы проверить это, я использую MustHaveHappenedOnceExactly от FakeItEasy:

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 голосов
/ 02 января 2019

Рефакторинг устройства для удовлетворения нуля, т. Е. .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()
);
...