2015-05-19 18 views
6

Sono nuovo a NSubstitute, sto provando a prendere in giro un metodo void con 2 parametri out e sono abbastanza sicuro che sto sbagliando.NSubstitute un metodo vuoto con parametri fuori

ho una classe CustomerDataAccess che ha un metodo con la seguente firma:

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

Il CustomerRepository chiama il suo metodo GetCustomer che poi chiama il metodo CustomerDataAccess.GetCustomerWithAddresses DAL. Il metodo DAL emette quindi due parametri out per il cliente e uno per gli indirizzi. Il metodo di repository utilizza quindi AutoMapper per associare i due oggetti dal metodo DAL a un dominio aziendale restituito dal repository.

Ecco il codice che ho finora e non funziona. La mia ricerca non mi ha aiutato a identificare ciò che devo fare per risolvere questo problema. Come imposto il valore dei miei parametri 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); 

risposta

11

out parametri vengono aggiornati con la loro posizione parametro come indice. È spiegato nello Returnsdocumentation for NSubstitute. Quindi, per il tuo caso particolare, stai popolando il secondo e il terzo parametro, quindi dovresti impostare la tua chiamata in questo modo:

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

Sì, quello che funzionava mancava l'accesso ai parametri specifici dell'array. – NathanFisherSdk