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
синтаксис является правильным.