2

我的代码中有这两行。

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

现在,我正在创建一个单元测试。对象、客户和员工都受到保护,所以我需要模拟它们。

我已经成功地模拟了第一个并创建了一个模拟对象“客户”作为通过 ID 获取客户的回报。

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*/

但是,尽管我在构建测试时没有任何错误。customer.employee 始终为 NULL。

4

3 回答 3

3

我建议你试试这个代码

Mock<Customer>() mockCustomer = new Mock<Customer>();
Employee employee = new Employee();
mockCustomer.Setup(x=>x.Employees).Returns(employee);
Customer customer = mockCustomer.Object;
于 2016-11-23T10:38:32.877 回答
1

Sethu Bala 的建议可能不起作用,因为您无法设置非虚拟成员。

您可以通过调用构造函数、构建器或 AutoFixure 之类的工具来创建客户和员工吗?然后设置您的存储库以返回这些对象。

var customer = CustomerBulder
    .WithEmployees(*list of employees*)
    .Build();
var mockCustomerRepository = new Mock<ICustomerRepository>();
mockCustomerRepository
    .Setup(p => p.GetById(It.IsAny<Guid>()))
    .Returns(customer);
于 2016-11-23T10:53:27.347 回答
1

如果不需要复杂的设置,请使用Linq to Mocks获取模拟对象。 Mock.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;

现在应该按预期执行单元测试。

于 2016-11-23T11:01:51.770 回答