NSubstitute模拟一个没有参数的void方法

本文关键字:参数 void 方法 一个 模拟 NSubstitute | 更新日期: 2023-09-27 17:49:41

我是NSubstitute的新手,我试图模拟具有2个out参数的void方法,我很确定我做错了。

我有一个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);

NSubstitute模拟一个没有参数的void方法

使用参数位置作为索引更新out参数。它在NSubstitute的Returns文档中有解释。因此,对于您的特殊情况,您将填充第二个和第三个参数,因此您应该像这样设置调用:

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" } };
});

对于非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语法是正确的。