Нзамен:Проверка полученных методов с аргументами массива
-
12-12-2019 - |
Вопрос
Я хочу убедиться, что метод моего макета NSubstitute вызывается с определенным аргументом массива.
Скажи интерфейс, IProcessor
, имеет метод void ProcessSomething(Foo[] something])
.Скажем, мой тестируемый класс назван Commander
.Я настроил свой тест следующим образом:
//prepare
var processor = Substitute.For<IProcessor>;
var commander = new Commander(processor);
var foo1 = new Foo("alpha");
var foo2 = new Foo("bravo");
var foos = new [] {foo1, foo2};
//act
commander.DoSomething(foo1, foo2);
//verify
processor.Received().ProcessSomething(foos); // FAILS
А Received()
вызов завершается неудачей:
NSubstitute.Exceptions.ReceivedCallsException : Expected to receive a call matching:
ProcessSomething(Foo[])
Actually received no matching calls.
Received 1 non-matching call (non-matching arguments indicated with '*' characters):
ProcessSomething(*Foo[]*)
Похоже, что ProcessSomething был вызван с каким-то массивом, отличным от foos
, верно?
Что ж, если я вместо этого проверю это, например, где я фиксирую значение аргумента, используя Arg.Do()
, это удается:
//prepare
//... as before
var actualFoos = null;
processor.ProcessSomething(Arg.Do<Foo[]>(x => actualFoos = x));
//act
commander.DoSomething(foo1, foo2);
//verify
Assert.That(actualFoos, Is.EqualTo(foos)); // SUCCEEDS
Таким образом, захват аргумента и сравнение его на равенство (с NUnit в этом примере) работает, но проверка полученного вызова не удалась.
Это ошибка в NSubstitute или я неправильно ее использую?
Решение
Я предполагаю, что твой Commander
объект примет аргументы и поместит их в массив, который затем использует для вызова Processor
насмехаться.
Твой foos
переменная — это еще один массив, который вы создаете в своей настройке.Массивы не сравниваются друг с другом, даже если они содержат одинаковые элементы.Таким образом, NSubstitute будет жаловаться, что не получил ожидаемого значения (он получил другой массив, который содержал те же элементы).
Редактировать: Попробуйте эту версию:
//prepare
var processor = Substitute.For<IProcessor>;
var commander = new Commander(processor);
var foo1 = new Foo("alpha");
var foo2 = new Foo("bravo");
var foos = new [] {foo1, foo2};
//act
commander.DoSomething(foo1, foo2);
//verify
processor.Received().ProcessSomething(Arg.Is<Foo[]>(foos2 => foos.SequenceEqual(foos2));
Для этого необходимо импортировать System.Linq
Пространство имен