Неспособность заменить - PullRequest
       21

Неспособность заменить

0 голосов
/ 27 августа 2018
[Theory]
[InlineData("12345678901","bob")]
[InlineData("12345678902", "alice")]
public void Customer_Registration_Should_Succeed(string identityId, string name)
{
    Customer customer = new Customer(identityId, name);

    _customerRepository.Add(customer).Returns(customer);

    var customerService = new CustomerService(_customerRepository);

    var expectedCustomer = customerService.Register(identityId, name);

    Assert.Equal(expectedCustomer, customer);

}

У меня есть вышеуказанный тестовый код.

Вот услуга:

public class CustomerService : ICustomerService
{
    readonly ICustomerRepository _customerRepository;
    public CustomerService(ICustomerRepository customerRepository)
    {
        _customerRepository = customerRepository;
    }

    public Customer Register(IdentityId identityId, Name name)
    {
        var customer = new Customer(identityId, name);
        var newCustomer = _customerRepository.Add(customer);

        return newCustomer;
    }
}

А ниже находится хранилище:

public class CustomerRepository : ICustomerRepository
{
    IList<Customer> _customers;

    public CustomerRepository()
    {
        _customers = new List<Customer>();
    }

    public Customer Add(Customer customer)
    {
        _customers.Add(customer);

        return customer;
    }
}

Но я получаю исключение нулевой ссылки.

Assert.Equal(expectedCustomer, customer);

и утверждение не выполняется. Почему?

1 Ответ

0 голосов
/ 28 августа 2018

Два отдельных экземпляра создаются,

тестируемый метод.

public Customer Register(IdentityId identityId, Name name)
{
    var customer = new Customer(identityId, name); //<-- HERE
    var newCustomer = _customerRepository.Add(customer);

    return newCustomer;
}

и тест

//...

Customer customer = new Customer(identityId, name); // <--HERE

_customerRepository.Add(customer).Returns(customer);

//...

Проблема в том, что экземпляр в тесте используется в качестве аргумента для настройки замены.

Заменитель будет ожидать точного экземпляра от установки, но тестируемый метод передает свой собственный экземпляр, что заставит замену возвратить нуль, поскольку аргументы не совпадают.

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

Например

_customerRepository.Add(Arg.Any<Customer>()).Returns(_ => _.Arg<Customer>());

Что может быть заявлено при необходимости

[Theory]
[InlineData("12345678901","bob")]
[InlineData("12345678902", "alice")]
public void Customer_Registration_Should_Succeed(string identityId, string name) {
    //Arrange
    _customerRepository.Add(Arg.Any<Customer>()).Returns(_ => _.Arg<Customer>());
    var customerService = new CustomerService(_customerRepository);

    //Act
    var actual = customerService.Register(identityId, name);

    //Assert
    Assert.IsNotNull(actual);
    Assert.AreEqual(actual.IdentityId, identityId);
    Assert.AreEqual(actual.Name, name);

    //Check received with the arg:
    _customerRepository.Received().Add(actual);
}
...