Несколько конфигураций вызова NSubstitute при доступе метода к различным свойствам параметра ссылочного типа (чтобы избежать исключения NullReferenceException) - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть следующий тестовый код, использующий NSubstitute:

[TestMethod]
public void Test()
{
    var foo = Substitute.For<IFoo>();
    foo.Foo(Arg.Is<Bar>(b => !b.X)).Returns(0); // Line 1
    foo.Foo(Arg.Is<Bar>(b => b.X)).Returns(1); // Line 2
}

public interface IFoo
{
    int Foo(Bar b);
}

public class Bar
{
    public bool X;
}

Когда строка 2 выполняется, генерируется исключение:

System.NullReferenceException: 'Objectссылка не установлена ​​на экземпляр объекта. '

Однако, исключение составляет , а не , если я изменяю !b.X на b != null && !b.X.Кажется, что лямбда-выражение в строке 1 оценивается с помощью пустой лямбда-переменной при вызове строки 2.

Я намерен создать более одной конфигурации вызова для метода, над которым я работаю.Итак, я делаю это неправильно?Есть ли другой способ сделать это?

1 Ответ

0 голосов
/ 19 декабря 2018

Проблема в том, что последняя настройка на поддельном члене отменяет все предыдущие договоренности.

Желаемое поведение может быть достигнуто с помощью

//Arrange
var foo = Substitute.For<IFoo>();
foo.Foo(Arg.Any<Bar>()).Returns(args => args.Arg<Bar>().X ? 1 : 0); 

//...
...