Нзамен:Проверка полученных методов с аргументами массива

StackOverflow https://stackoverflow.com//questions/12699066

  •  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 Пространство имен

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top