2009-11-26 2 views
1

이전에 질문을 받았는지 확실하지 않은 경우 여기에 질문이 나와 있습니다. 첫째Moq를 사용하여 메서드를 조롱 할 때 메서드 인수의 속성 값이 설정되어 있는지 확인하는 방법?

코드 :

public class Customer { 
     public string Password { get; set; } 
     public string PasswordHash { get; set; } 
    } 
    public class CustomerService { 
     private ICustomerRepository _repo; 

     public CustomerService(ICustomerRepository repo) { 
      _repo = repo; 
     } 

     public int? AddCustomer(Customer customer) { 
      customer.PasswordHash = SHA1Hasher.ComputeHash(customer.Password); 
      return _repo.Add(customer); 
     } 
    } 

    public interface ICustomerRepository { 
     int? Add(Customer c); 
    } 
    public class CustomerRepository : ICustomerRepository { 
     int? AddCustomer(Customer customer) { 
      // call db and return identity 
      return 1; 
     } 
    } 

    [TestClass] 
    public class CustomerServiceTest { 
     [TestMethod] 
     public void Add_Should_Compute_Password_Hash_Before_Saving() { 
      var repoMock = new Mock<ICustomerRepository>(); 
      //how do I make sure the password hash was calculated before  passing the customer to repository??? 
     } 
    } 

가 어떻게 고객이 리포지토리에 전달하기 전에 PasswordHash를 할당하는 CustomerService를 확인합니까?

답변

1

몇 가지 방법을 사용할 수 있습니다. 꼭 필요한 것은 아니지만 기존 API를 변경하지 않아도됩니다. SHA1Hasher.ComputeHash가 공용 메서드라고 가정합니다.

[TestClass] 
public class CustomerServiceTest 
{ 
    [TestMethod] 
    public void Add_Should_Compute_Password_Hash_Before_Saving() 
    { 
     var customer = new Customer { Password = "Foo" }; 
     var expectedHash = SHA1Hasher.ComputeHash(customer.Password); 

     var repoMock = new Mock<ICustomerRepository>(); 
     repoMock 
      .Setup(r => r.Add(It.Is<Customer>(c => c.PasswordHash == expectedHash))) 
      .Returns(1) 
      .Verifiable(); 

     // invoke service with customer and repoMock.Object here... 

     repoMock.Verify(); 
    } 
} 

약간 더 나은 솔루션을 사용하면 PasswordHash 속성이 IHasher 인스턴스에 의해 생성 된 값이 할당되었는지 확인 할 수 있도록 (예 : IHasher 등) 주입 서비스로 SHA1Hasher을 설정하는 것입니다.

API를 더 많이 열면 PasswordHash 속성을 가상으로 만들 수 있으므로 Mock Customer를 AddCustomer 메서드에 전달하여 속성이 올바르게 설정되었는지 확인할 수 있습니다.

0

SHA1Hasher를 비 정적 및 가상으로 만들거나 ISHA1Hasher 인터페이스로 포장하여 조롱 할 수 있습니다. mockable 클래스에서 정적 메서드와 개체를 래핑하는 것은 테스트 가능성을 높이는 고전적인 방법입니다.

관련 문제