NSubstitute: Почему вызов фиктивной функции возвращает ноль, если параметром функции является byte [] / class? - PullRequest
0 голосов
/ 03 апреля 2020

Я создал замену с помощью NSubstitute

var mockService = Substitute.For<IService>(); 

У меня есть успех при замене функций из IService , только если параметр функции равен integer . В другом случае я получаю результат null / 0 / byte [0] , когда мой код вызывает функции IService .

MyResponse Request(byte[] request, MyAddress target); //null
int test(int t); //expected result
int SimpleRequest(byte[] request, MyAddress target); /0
MyResponse SimpleParam(int i); //expected result
byte[] testbyte(byte[] t); //byte[0]
byte[] testintbyte(int t); //expected result
int testbyteint(byte[] t); //0

Когда я докажу эту функцию в тесте они возвращают значения, как и ожидалось:

Assert.Equal(mockService.Request(request, target), MyResponse);//true

Почему я могу использовать только целое число в качестве параметра функции в NSubstitute?

1 Ответ

0 голосов
/ 04 апреля 2020

Кажется, что передаваемый byte[] - это другой массив. Они могут иметь одинаковые значения, но могут быть разными ссылками.

var testBytes = new byte[] { 0x1, 0x2, 0x3 };

mockService.testbyteint(testBytes).Returns(42);

Assert.Equal(mockService.testbyteInt(testBytes), 42);

Этот тест должен пройти, поскольку значение testBytes указывает на ту же ссылку, которая использовалась для обозначения вызова с помощью Returns, а также для фактический вызов, используемый в утверждении. Есть еще несколько примеров в документации Return для спецификаций c args .

Для случаев, когда у нас нет точной требуемой ссылки, мы можем использовать соответствий аргументов чтобы определить, каким значениям мы должны соответствовать:

var testBytes = new byte[] { 0x1, 0x2, 0x3 };

mockService.testbyteint(Arg.Is<byte[]>(bytes => bytes.SequenceEqual(new[] {0x1, 0x2, 0x3 })).Returns(42);

Assert.Equal(mockService.testbyteInt(testBytes), 42);

Другой вариант, когда мы не обращаем внимания на то, какой аргумент мы получаем, мы можем использовать ReturnsForAnyArgs:

var testBytes = new byte[] { 0x1, 0x2, 0x3 };

mockService.testbyteint(null).ReturnsForAnyArgs(42);

Assert.Equal(mockService.testbyteInt(testBytes), 42);

Надеюсь, это поможет.

...