2016-11-23 14 views
0

私はこれらの2行を自分のコードに持っています。mockedオブジェクト内でmockedオブジェクトを作成するにはどうすればよいですか?

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

ここでユニットテストを作成します。オブジェクト、顧客、従業員の両方が保護されているので、私はそれらを嘲笑する必要があります。

私は正常に最初の1つを嘲笑し、顧客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です。

答えて

1

私はおそらく文句を言わない作業このコード

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

にSethuバラからの提案をしようとするあなたをお勧めしますが、できません、セットアップ非仮想メンバーので。

コンストラクタ、ビルダー、またはAutoFixureのようなツールを呼び出してCustomerとEmployeeを作成できますか?それらのオブジェクトを返すようにリポジトリを設定します。

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; 

これで、単体テストが正常に実行されます。

関連する問題