NSubstitute имитирует метод void без параметров

Я новичок в NSubstitute, я пытаюсь издеваться void метод с 2 out параметры, и я уверен, что я делаю это неправильно.

у меня есть CustomerDataAccess класс, который имеет метод со следующей сигнатурой:

void GetCustomerWithAddresses(int customerId, 
                              out List<Customer> customers, 
                              out List<Address> addresses);

на CustomerRepository называет GetCustomer метод, который затем вызывает CustomerDataAccess.GetCustomerWithAddresses метод DAL. Затем метод DAL выводит два out параметры один для клиента и один для адресов. Затем метод репозитория использует AutoMapper на карту два объекта из метода DAL в бизнес-домен, который затем возвращает репозиторий.

вот код, который у меня есть до сих пор, и он не работает. Мое исследование не помогли мне определить, что мне нужно сделать, чтобы исправить эту проблему. Как установить значение my out параметры?

// Arange
ICustomerDataAccess customerDataAccess = Substitute.For<ICustomerDataAccess>();
IList<Customer> customers;
IList<Address> addresses;

customerDataAccess.When(x => x.GetCustomerWithAddresses(
    1, out customers, out addresses))
    .Do(x =>
    {
        customers = new List<Customer>() { new Customer() { CustomerId = 1, CustomerName = "John Doe" } };
        addresses = new List<Address>() { new Address() { AddressId = 1, AddressLine1 = "123 Main St", City = "Atlanta" } };
    });

CustomerRepository sut = new CustomerRepository(customerDataAccess);

// Act
Customer customer = sut.GetCustomer(1);

// Assert
Assert.IsNotNull(customer);

2 ответов


out параметры обновляются, используя их положение параметра в качестве индекса. Это объясняется в Returns документация для NSubstitute. Итак, для вашего конкретного случая вы заполняете второй и третий параметры, поэтому вы должны настроить свой вызов следующим образом:

customerDataAccess.When(x => x.GetCustomerWithAddresses(1, out customers, out addresses))
.Do(x =>
{
    x[1] = new List<Customer>() { new Customer() { CustomerId = 1, CustomerName = "John Doe" } };
    x[2] = new List<Address>() { new Address() { AddressId = 1, AddressLine1 = "123 Main St", City = "Atlanta" } };
});

для методов Non-void можно использовать обычный синтаксис возврата:

 var haveWithAddresses = customerDataAccess.GetCustomerWithAddresses(1, out customers, out addresses)
                                           .Returns(callInfo => { 
                                                                 callInfo[0] = new List<Customer>();
                                                                 callInfo[1] = new List<Address>();
                                                                 return true;
                                                                 });

С Void методы When...Do синтаксис является правильным.