2016-11-23 5 views
0

У меня эти две строки на моем коде.Как я могу создать издеваемый объект внутри издевающегося объекта?

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

Теперь я создаю единичный тест. Оба объекта, клиент и сотрудник защищены, поэтому мне нужно их издеваться.

Я успешно издевался над первым и создал «клиента» издевавшегося объекта в качестве возврата для получения клиентом по идентификатору.

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; 

Как вы можете видеть, «работник» объект находится внутри издевались объекта «клиент», который означает, что я также должен обеспечить высмеивал объект внутри моего первого издевались объекта (Заказчик). Я ожидаю, что мой код будет таким.

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

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

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

Однако, хотя у меня нет никаких ошибок при создании моего теста. Клиент-клиент - ВСЕГДА NULL.

ответ

1

Я хотел бы предложить вам попробовать этот код

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

предложению от Sethu Бала, вероятно, не будет работать, потому что вы не можете установить не являющиеся виртуальные члены.

Не могли бы вы создать Customer and Employee, вызвав конструктор, строитель или какой-нибудь инструмент, например AutoFixure? А затем настройте репозиторий для возврата этих объектов.

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

Используйте Linq to MocksMock.Of<T>, чтобы получить высмеивал объект, если нет сложной установки не требуется. Это позволит присвоить значения свойств.

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; 

Это должно теперь выполнить модульное испытание, как ожидалось.