1

我正在尝试使用 Nunit、Ninject、MVC2 和 ADO.Net 实体数据模型来解决问题。

假设我有一个 ProductsController 实例化一个 SqlProductsRepository 类。

public class ProductsRepository : IProductsRepository
{
    public MyDbEntities _context;

    public ProductsRepository()
    {
        _context = new MyDbEntities();
    }

    public IList<Product> GetAllProducts()
    {
        return (from p in _context.Products select p).ToList();
    }
}

public class ProductsController : Controller
{
    public ActionResult ProductsList()
    {
        ProductsRepository r = new ProductsRepository();
        var products = r.GetAllProducts();

        return View(products);
    }
}

我希望能够对 ProductsRepository 执行单元测试,以确保返回正确的数据,但我不确定如何编写测试类。

到目前为止,我阅读的每个教程/文档都指向我使用 IProductsRepository 创建一个 Mock 对象,然后注入和测试控制器。

在我看来,这似乎绕过了具体的实现。

MyDbEntities 来自 ADO.Net 实体数据模型 .edmx

4

3 回答 3

3

你完全正确——模拟存储库确实绕过了具体的实现。这才是重点。

单元测试与功能测试不同。您的模拟对象可以设置为返回您明确定义的任何内容,然后进行测试以确保来自模拟的持续输入导致预期结果。

于 2010-07-15T15:46:43.523 回答
2

听起来您想为 ProductsRepository 创建集成测试而不是单元测试,因为您将针对数据库进行测试,以便检查它是否为您提供了正确的数据。

在对控制器进行单元测试时,您希望模拟 ProductsRepository。

在我对 ProductsRepository 的集成测试中,我会做一些显而易见的事情,比如

public void TestProductsRepository()
{
  var context = new MyDbEntities();

  // add a new product

  var products = context.GetAllProducts();

  // check products contains new product
}
于 2010-07-15T15:44:12.420 回答
2

使用您的两个类(ProductsRepository、ProductsController),您应该有两组测试。每个班级一组测试。

当(单元)测试 ProductsController 时,您应该模拟它的依赖项(在本例中为 IProductsRepository)。绕过依赖项的具体实现是重点。

将有一组完全不同的(集成)测试来验证 ProductsRepository 是否可以访问数据库并返回正确的数据。在这些集成测试中,您不会模拟任何内容,因为您要测试的是真实存储库与实际数据库之间的交互。

于 2010-07-15T15:50:24.933 回答