Мой код работает отлично, НО.Какова лучшая практика в этом случае?
Вот код, который важен.
Это в контроллере.
private IProductRepository repository;
[HttpPost]
public ActionResult Delete(int productId) {
Product prod = repository.Products.FirstOrDefault(p => p.ProductID == productId);
if (prod != null) {
repository.DeleteProduct(prod);
TempData["message"] = string.Format("{0} was deleted", prod.Name);
}
return RedirectToAction("Index");
}
Это хранилище (оба интерфейсаи т.д.)
public interface IProductRepository {
IQueryable<Product> Products { get; }
void SaveProduct(Product product);
void DeleteProduct(Product product);
}
А вот и хранилище ..... (важная часть) Я хочу отметить, что ... это не фальшивый класс, как это довольно ясно.Тестирование выполняется на поддельных классах.
private EFDbContext context = new EFDbContext();
public IQueryable<Product> Products {
get { return context.Products; }
}
public void DeleteProduct(Product product) {
context.Products.Remove(product);
context.SaveChanges();
}
Ну, первый вопрос: при тестировании этого я сделаю два метода TestMethods на контроллере в «ControllerTest».«Can_delete_valid_product» и «Cannot_delete_invalid_product».Есть ли смысл иметь тестовый класс для репозитория?Как и «RepositoryTest», после того, как контроллер проверяет, работает ли функция удаления, нет необходимости проверять его дважды, верно?
Второй вопрос: в этом тесте в контроллере, если продукт существует, перед попыткой его удаления.Если он существует, я вызываю функцию удаления в хранилище.Это означает, что не должно быть возможности исключения.НО вы все равно можете создать исключение в хранилище, если отправите ноль.(что не может произойти здесь, но вы все равно можете сделать это, если вы забудете проверить, если ноль).Вопрос в том, стоит ли вместо этого проводить проверку наличия продукта в хранилище?