2

コードにこれらの 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」オブジェクトはモック オブジェクト「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*/

ただし、テストのビルドにエラーはありません。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 などのツールを呼び出して、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);
于 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 に答える