2015-05-19 7 views
6

Ich bin neu bei NSubstitute, ich versuche, eine void Methode mit 2 out Parameter zu verspotten und ich bin mir ziemlich sicher, dass ich es falsch mache.NSubstitute Mock eine void-Methode mit out-Parameter

Ich habe eine CustomerDataAccess Klasse, das ein Verfahren mit der folgenden Signatur hat:

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

Die CustomerRepository nennt seine GetCustomer Methode, die dann die Methode CustomerDataAccess.GetCustomerWithAddresses DAL aufruft. Die DAL-Methode gibt dann zwei out Parameter für den Kunden und einen für Adressen aus. Die Repository-Methode verwendet dann AutoMapper, um die beiden Objekte der DAL-Methode einer Geschäftsdomäne zuzuordnen, die das Repository dann zurückgibt.

Hier ist der Code, den ich bisher habe und es funktioniert nicht. Meine Forschung hat mir nicht geholfen, zu identifizieren, was ich tun muss, um dieses Problem zu beheben. Wie stelle ich den Wert meiner out Parameter ein?

// 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); 

Antwort

11

out Parameter werden aktualisiert Parameterposition als Index verwendet wird. Es ist in der Returnsdocumentation for NSubstitute erklärt. Also, für Ihren speziellen Fall füllen Sie den zweiten und dritten Parameter, also sollten Sie Ihren Anruf wie folgt einrichten:

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

Ja funktionierte ich fehlte den Zugriff auf die spezifischen Parameter im Array. – NathanFisherSdk