Рассмотрим следующий кусок обслуживания:
public class ProductService : IProductService {
private IProductRepository _productRepository;
// Some initlization stuff
public Product GetProduct(int id) {
try {
return _productRepository.GetProduct(id);
} catch (Exception e) {
// log, wrap then throw
}
}
}
Рассмотрим простой unit test:
[Test]
public void GetProduct_return_the_same_product_as_getProduct_on_productRepository() {
var product = EntityGenerator.Product();
_productRepositoryMock.Setup(pr => pr.GetProduct(product.Id)).Returns(product);
Product returnedProduct = _productService.GetProduct(product.Id);
Assert.AreEqual(product, returnedProduct);
_productRepositoryMock.VerifyAll();
}
Сначала кажется, что этот тест в порядке. Но немного измените наш метод обслуживания:
public Product GetProduct(int id) {
try {
var product = _productRepository.GetProduct(id);
product.Owner = "totallyDifferentOwner";
return product;
} catch (Exception e) {
// log, wrap then throw
}
}
Как переписать заданный тест, который он передал бы с первым методом службы, и не со вторым?
Как вы справляетесь с такими сценариями простой?
СОВЕТ 1: Данный тест является плохим продуктом coz и возвращается. Продукт действительно является тем же самым ссылкой.
СОВЕТ 2: Реализация элементов равенства (object.equals) не является решением.
СОВЕТ 3: На данный момент я создаю клон экземпляра Product (expectedProduct) с помощью AutoMapper, но мне это не нравится.
СОВЕТ 4: Я не тестирую, что SUT НЕ делает. Я пытаюсь проверить, что SUT DOES возвращает тот же объект, что и в репозитории.