Как проверить, установлены ли значения свойств этого аргумента метода при насмешливых методах с Moq? - PullRequest
1 голос
/ 26 ноября 2009

Не уверен, если это было задано ранее, вот вопрос.

Сначала код:

    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???
        }
    }

Как проверить, что CustomerService назначил PasswordHash перед передачей клиента в хранилище?

Ответы [ 2 ]

1 голос
/ 26 ноября 2009

Есть несколько подходов, которые вы можете использовать. Хотя это и не обязательно лучшее решение, вот то, которое не требует от вас изменения существующего 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();
    }
}

Несколько лучшим решением было бы превратить SHA1Hasher во внедренную службу (например, IHasher), чтобы вы могли подтвердить, что свойству PasswordHash присвоено значение, созданное экземпляром IHasher.

Открыв свой API еще больше, вы можете сделать свойство PasswordHash виртуальным, чтобы можно было передать Mock Customer методу AddCustomer, чтобы убедиться, что свойство установлено правильно.

0 голосов
/ 26 ноября 2009

Вы можете сделать SHA1Hasher нестатичным и виртуальным или обернуть его в интерфейс ISHA1Hasher, который затем можно будет смоделировать. Обертывание статических методов и объектов в фиктивных классах является классическим способом повышения тестируемости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...