NSubstitute 模拟一个没有参数的 void 方法
NSubstitute mock a void method with out parameters
我是 NSubstitute 的新手,我正在尝试使用 2 out
参数模拟一个 void
方法,我很确定我做错了。
我有一个 CustomerDataAccess
class,它有一个具有以下签名的方法:
void GetCustomerWithAddresses(int customerId,
out List<Customer> customers,
out List<Address> addresses);
CustomerRepository
调用其 GetCustomer
方法,然后调用 CustomerDataAccess.GetCustomerWithAddresses
DAL 方法。 DAL 方法然后输出两个 out
参数,一个用于客户,一个用于地址。存储库方法然后使用 AutoMapper
将两个对象从 DAL 方法映射到存储库然后 returns 的业务域。
这是我目前使用的代码,但无法正常工作。我的研究并没有帮助我确定我需要做什么来解决这个问题。如何设置 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);
out
参数使用其参数位置作为索引进行更新。 Returns
documentation for 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" } };
});
对于非 void 方法,可以使用常规 return 语法:
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
语法是正确的。
我是 NSubstitute 的新手,我正在尝试使用 2 out
参数模拟一个 void
方法,我很确定我做错了。
我有一个 CustomerDataAccess
class,它有一个具有以下签名的方法:
void GetCustomerWithAddresses(int customerId,
out List<Customer> customers,
out List<Address> addresses);
CustomerRepository
调用其 GetCustomer
方法,然后调用 CustomerDataAccess.GetCustomerWithAddresses
DAL 方法。 DAL 方法然后输出两个 out
参数,一个用于客户,一个用于地址。存储库方法然后使用 AutoMapper
将两个对象从 DAL 方法映射到存储库然后 returns 的业务域。
这是我目前使用的代码,但无法正常工作。我的研究并没有帮助我确定我需要做什么来解决这个问题。如何设置 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);
out
参数使用其参数位置作为索引进行更新。 Returns
documentation for 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" } };
});
对于非 void 方法,可以使用常规 return 语法:
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
语法是正确的。