Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在模拟对象内创建模拟对象?_C#_Unit Testing_Mocking_Moq_Moq 3 - Fatal编程技术网

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;
现在应该按照预期进行单元测试