2016-11-23 3 views
0

Ich habe diese zwei Zeilen auf meinem Code.Wie kann ich ein verspottetes Objekt in einem verspotteten Objekt erstellen?

Customer customer = Repository.Customer.GetById(customerId); 
Employee employee = customer.Employees.Single(e => e.IsPrimaryContact); 

Jetzt erstelle ich einen Komponententest. Beide Objekte, Kunde und Mitarbeiter, sind geschützt, daher muss ich sie verspotten.

Ich habe das erste erfolgreich verspottet und ein verspottetes Objekt 'Kunde' als Rückgabe für den Kunden By Id erstellt.

Customer customer = new Mock<Customer>().Object; 
/* code ... code*/ 

var mockCustomerRepository = new Mock<ICustomerRepository>(); 
mockCustomerRepository.Setup(p => p.GetById(It.IsAny<Guid>())).Returns(customer); 
Repository.Customer = mockCustomerRepository.Object; 

Wie Sie sehen können, die ‚Arbeitnehmer‘ Objekt befindet sich innerhalb des verspottete Objekt ‚Kunde‘, das bedeutet, dass ich auch eine verspottete Objekt in meinem ersten verspottet Objekt liefern (Kunde). Ich erwarte, dass mein Code so ist.

Employee employee = new Mock<Employee>().Object; 
employee.IsPrimaryContact = true; 

List<Employee> employees = new List<Employee>(); 
employees.Add(employee); 

customer.Employees = employees; 
/* code ... code*/ 

jedoch, obwohl ich auf den Aufbau von meinem Test einen Fehler nicht haben. Der customer.employee ist IMMER NULL.

Antwort

1

Ich würde Ihnen vorschlagen, diesen Code

Mock<Customer>() mockCustomer = new Mock<Customer>(); 
Employee employee = new Employee(); 
mockCustomer.Setup(x=>x.Employees).Returns(employee); 
Customer customer = mockCustomer.Object; 
0

Der Vorschlag von Sethu Bala wahrscheinlich nicht funktionieren, weil Sie nicht können Setup nicht virtuellen Mitglieder zu versuchen.

Können Sie Kunden und Mitarbeiter erstellen, indem Sie Konstruktor, Builder oder ein Tool wie AutoFixure aufrufen? Richten Sie dann Ihr Repository ein, um diese Objekte zurückzugeben.

var customer = CustomerBulder 
    .WithEmployees(*list of employees*) 
    .Build(); 
var mockCustomerRepository = new Mock<ICustomerRepository>(); 
mockCustomerRepository 
    .Setup(p => p.GetById(It.IsAny<Guid>())) 
    .Returns(customer); 
1

Verwenden Sie die Linq to MocksMock.Of<T> das verspottete Objekt zu erhalten, wenn keine komplizierte Einrichtung erforderlich ist. Es ermöglicht die Zuweisung von Eigenschaftswerten.

Employee employee = Mock.Of<Employee>(); 
employee.IsPrimaryContact = true; 

List<Employee> employees = new List<Employee>(); 
employees.Add(employee); 

Customer customer = Mock.Of<Customer>(); 
customer.Employees = employees; 

var mockCustomerRepository = new Mock<ICustomerRepository>(); 
mockCustomerRepository.Setup(p => p.GetById(It.IsAny<Guid>())).Returns(customer); 
Repository.Customer = mockCustomerRepository.Object; 

Dies sollte nun den Komponententest wie erwartet ausführen.

Verwandte Themen