【问题标题】:How can I create a mocked object inside a mocked object?如何在模拟对象中创建模拟对象?
【发布时间】:2017-04-07 07:21:09
【问题描述】:

我的代码中有这两行。

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。

【问题讨论】:

    标签: c# unit-testing mocking moq moq-3


    【解决方案1】:

    我建议你试试这个代码

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        如果不需要复杂的设置,请使用 Linq to Mocks Mock.Of&lt;T&gt; 获取模拟对象。它将允许分配属性值。

        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;
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-15
          相关资源
          最近更新 更多