Unit testing 我应该把这段代码放在MVC的什么地方?
我的代码工作得很好,但是。在这种情况下,最好的做法是什么 以下是重要的代码 这是在控制器中Unit testing 我应该把这段代码放在MVC的什么地方?,unit-testing,asp.net-mvc-3,logic,Unit Testing,Asp.net Mvc 3,Logic,我的代码工作得很好,但是。在这种情况下,最好的做法是什么 以下是重要的代码 这是在控制器中 private IProductRepository repository; [HttpPost] public ActionResult Delete(int productId) { Product prod = repository.Products.FirstOrDefault(p => p.ProductID == productId);
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");
}
这是存储库(包括接口等)
公共接口存储库{
IQueryable产品{get;}
无效保存产品(产品);
无效产品(产品);
}
存储库来了。。。。。(重要的部分)我想指出的是。。。很明显,这不是一个伪造的职业。该测试是在伪造的类上进行的
private EFDbContext context = new EFDbContext();
public IQueryable<Product> Products {
get { return context.Products; }
}
public void DeleteProduct(Product product) {
context.Products.Remove(product);
context.SaveChanges();
}
private EFDbContext context=new EFDbContext();
公共卫生产品{
获取{return context.Products;}
}
公共产品(产品){
context.Products.Remove(产品);
SaveChanges();
}
那么第一个问题:
在对其进行测试时,我将在“ControllerTest”中对控制器进行两个测试方法。“可以删除有效产品”和“不能删除无效产品”。为存储库设置testclass有什么意义吗?像“RepositoryTest”一样,在所有控制器测试之后,如果delete函数工作,就不需要测试它两次,对吗
第二个问题:
在本例中,我在尝试删除该产品之前,在控制器中测试该产品是否存在。如果它存在,我调用存储库中的delete函数。这意味着永远不可能出现异常。但如果发送null,仍然可以在存储库中创建异常。(这在这里不可能发生,但如果忘记检查是否为null,您仍然可以这样做)。问题是,是否应该在存储库中测试产品是否存在?我更倾向于在大部分情况下将逻辑排除在控制器之外。控制器操作的测试验证是否调用了存储库,但在该测试中模拟了存储库本身。我会让存储库负责处理空检查。我更喜欢在大多数情况下将逻辑排除在控制器之外。控制器操作的测试验证是否调用了存储库,但在该测试中模拟了存储库本身。我会让存储库负责处理空检查 这意味着永远不可能出现异常。但如果发送null,仍然可以在存储库中创建异常。(这在这里不可能发生,但如果忘记检查是否为null,您仍然可以这样做) 或者,如果在您检查它是否存在后但在您删除它之前删除了它。或者如果您与存储库失去连接(或者在这种情况下该方法将永远不会返回?)。您无法以这种方式避免异常 这意味着永远不可能出现异常。但如果发送null,仍然可以在存储库中创建异常。(这在这里不可能发生,但如果忘记检查是否为null,您仍然可以这样做) 或者,如果在您检查它是否存在后但在您删除它之前删除了它。或者如果您与存储库失去连接(或者在这种情况下该方法将永远不会返回?)。您无法以这种方式避免异常
private EFDbContext context = new EFDbContext();
public IQueryable<Product> Products {
get { return context.Products; }
}
public void DeleteProduct(Product product) {
context.Products.Remove(product);
context.SaveChanges();
}