Хорошо. Тогда придется написать побольше кода.
Итак у нас есть например следующие модели:
1) Product - товар
2) MaterialGroup - группа материалов
3) Price - цена товара в зависимости от группы материалов(или просто цена если группа не определена)
Код моделей:
public class Product
{
//main
public int Id { get; set; }
public string Name { get; set; }
//....
//prices
public List<Price> Prices { get; set; }
public int CalcPrice {get;set;}
}
public class MaterialGroup
{
public int MaterialGroupId { get; set; }
public string Name { get; set; }
///.....
}
public class Price
{
public int PriceId { get; set; }
public Product.Product Product { get; set; }
public MaterialGroup MaterialGroup { get; set; }
public int BasePrice { get; set; }
}
Так же имеем модели DTO по типу ProductDto, PriceDto и.т.д. которые полностью копируют базовые модели.
Теперь создаем репозиторий:
public class ProductAdmRepository
{
public ProductDto Add(ProductDto productDto)
{
using (var context = new SomeContext())
{
try
{
var product = new Product();
// тут некоторая логика по формированию Product
// например если у товара несколько групп материалов и для каждого своя цена
// то мы вычисляем минимальную и приравниваем Product.CalcPrice к ней
context.Products.Add(product);
context.SaveChanges();
var productDto = new ProductDto();
//тут происходит маппинг product в productDto
//return productDto;
}
catch (Exception)
{
return null;
}
}
}
}
Тест:
[TestMethod]
public void TestDeb()
{
var userProductDto = new ProductDto()
{
Name = "Product with materials",
PriceDtos = new List<PriceDto>()
{
new PriceDto() {MaterialGroupDto = new MaterialGroupDto() {MaterialGroupId = 1}, Price = 100},
new PriceDto() {MaterialGroupDto = new MaterialGroupDto() {MaterialGroupId = 2}, Price = 200},
}
};
var assertProduct = new ProductDto()
{
//...то что должны получить на выходе
CalcPrice = 100
};
var repo = new ProductAdmRepository();
var newProduct = repo.Add(userProductDto);
Assert.IsTrue(newProduct.Equals(assertProduct));
}
Т.е. суть в том что я определяю в тесте 2 dto:
1) Которое будет имитировать введенные пользователем данные
2) Второе которое должно быть получено после того как система обработало первое dto
3) Сравниваю второе dto с тем которое получил в ходе тестирования и если они отличаются то тест не пройден
В чем проблема, поскольку репозиторий работает с реальной БД , а тест нет, то при проверке на добавление товара метод добавления не может получить например сущности групп материалов на основе которых он создаст сущность цены.