Два отдельных экземпляра создаются,
тестируемый метод.
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);
}