C# 如何在模拟对象内创建模拟对象?
我的代码里有这两行C# 如何在模拟对象内创建模拟对象?,c#,unit-testing,mocking,moq,moq-3,C#,Unit Testing,Mocking,Moq,Moq 3,我的代码里有这两行 Customer customer = Repository.Customer.GetById(customerId); Employee employee = customer.Employees.Single(e => e.IsPrimaryContact); 现在,我正在创建一个单元测试。客户和员工这两个对象都受到保护,所以我需要模拟它们 我已经成功地模拟了第一个对象,并创建了一个模拟对象“customer”,作为按Id获取客户的返回 Customer cust
Customer customer = Repository.Customer.GetById(customerId);
Employee employee = customer.Employees.Single(e => e.IsPrimaryContact);
现在,我正在创建一个单元测试。客户和员工这两个对象都受到保护,所以我需要模拟它们
我已经成功地模拟了第一个对象,并创建了一个模拟对象“customer”,作为按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;
Customer=newmock().Object;
/*代码。。。代码*/
var mockCustomerRepository=new Mock();
mockCustomerRepository.Setup(p=>p.GetById(It.IsAny()).Returns(customer);
Repository.Customer=mockCustomerRepository.Object;
如您所见,“employee”对象位于模拟对象“customer”内,这意味着我还必须在第一个模拟对象(customer)内提供一个模拟对象。我希望我的代码是这样的
Employee employee = new Mock<Employee>().Object;
employee.IsPrimaryContact = true;
List<Employee> employees = new List<Employee>();
employees.Add(employee);
customer.Employees = employees;
/* code ... code*/
Employee=newmock().Object;
employee.IsPrimaryContact=true;
列出员工=新列表();
employees.Add(employees);
customer.Employees=员工;
/*代码。。。代码*/
然而,尽管我在构建测试时没有任何错误。customer.employee始终为空。我建议您尝试此代码
Mock<Customer>() mockCustomer = new Mock<Customer>();
Employee employee = new Employee();
mockCustomer.Setup(x=>x.Employees).Returns(employee);
Customer customer = mockCustomer.Object;
Mock()mockCustomer=new Mock();
员工=新员工();
mockCustomer.Setup(x=>x.Employees).Returns(Employees);
Customer=mockCustomer.Object;
Sethu Bala的建议可能行不通,因为您无法设置非虚拟成员
您能否通过调用构造函数、生成器或Autofixe之类的工具来创建客户和员工?然后设置存储库以返回这些对象
var customer = CustomerBulder
.WithEmployees(*list of employees*)
.Build();
var mockCustomerRepository = new Mock<ICustomerRepository>();
mockCustomerRepository
.Setup(p => p.GetById(It.IsAny<Guid>()))
.Returns(customer);
var客户=客户集装机
.WithEmployees(*员工名单*)
.Build();
var mockCustomerRepository=new Mock();
mockCustomerRepository
.Setup(p=>p.GetById(It.IsAny())
.退货(客户);
如果不需要复杂的设置,请使用的Mock.Of
获取模拟对象。它将允许分配属性值
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;
Employee=Mock.Of();
employee.IsPrimaryContact=true;
列出员工=新列表();
employees.Add(employees);
Customer=Mock.Of();
customer.Employees=员工;
var mockCustomerRepository=new Mock();
mockCustomerRepository.Setup(p=>p.GetById(It.IsAny()).Returns(customer);
Repository.Customer=mockCustomerRepository.Object;
现在应该按照预期进行单元测试