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

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

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

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

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

Вот код, который у меня есть до сих пор, и он не работает. Мое исследование не помогло мне определить, что мне нужно сделать, чтобы решить эту проблему. Как установить значение моих 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);

person NathanFisherSdk    schedule 19.05.2015    source источник


Ответы (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" } };
});
person forsvarir    schedule 19.05.2015
comment
Да, это сработало, мне не хватало доступа к определенным параметрам в массиве. - person NathanFisherSdk; 20.05.2015

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

 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 верен.

person Josh Gust    schedule 03.10.2018