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();
        }