使用数据访问层进行单元测试

时间:2010-05-05 18:32:34

标签: c# asp.net-mvc unit-testing linq-to-sql n-tier-architecture

使用LINQ to SQL DAL编写单元测试的好方法是什么?

目前我正在进行一些数据库测试,需要创建访问数据库的辅助方法,但我不希望在我的主要仓库中使用这些方法。

所以我所拥有的是DAL的两个副本,一个在我的主项目中,一个在Test项目中。如果我为数据层创建一个单独的项目,那么管理这些东西会更容易吗?我不确定哪种方式可以更好地解决这个问题。

如果我创建了一个数据层项目,我是否也会将所有回购项目移动到该项目中?我不确定如何正确设置图层。

由于

2 个答案:

答案 0 :(得分:6)

我将使用Visual Studio杂志2009年9月文章中标题为“消除测试驱动开发中的数据库依赖性”中概述的存储库模式。自从我读完这篇文章以来,我一直在使用这种模式。这种模式有助于解耦数据层并编写好的单元测试。

这将要求您采用n层架构并创建单独的数据层,但从长远来看,这是值得的。

以下是在线文章的链接。 Repository Pattern

答案 1 :(得分:5)

我正在使用Linq2Sql作为我的DAL层,我把它作为一个单独的项目。在我的域项目中,我有一个存储库接口,然后我在我的DAL项目中使用自定义Linq2SqlCarRepository实现,该类包装生成的Linq2Sql类。

例如。 在Car.Core项目中

 public interface ICarRepository
 {
    IQueryable<Car> GetAllCars();
    void Add(Car);
 }

然后我有一个接口的实现,它包含了对生成的Linq2Sql类的访问。

Car.Data项目

public class SqlCarRepository : ICarRepository
{
    private CarDataContext _context;

    public SqlCarRepository()
    {
        _context = new CarDataContext();
    }

    #region ICarRepository Members

    public IQueryable<Car> GetAllCars()
    {
        return _context.Cars;
    }

然后我有一个测试项目Car.Data.Test,然后使用模拟来模拟ICarRepository并进行测试。我认为这与你所描述的略有不同。但是我想你想尝试从你的应用程序中分离你的DAL,这样它就是一个外围设备,如果你愿意,可以换掉它。

我还没有完全排序,但我目前有这些项目:

Car.Core         --- All the interfaces and domain objects, DTO's etc
Car.Core.Tests   --- The tests of the core business logic.
Car.Web          --- Asp.net MVC frontend
Car.Web.Tests    --- Tests for the website
Car.Data         --- The Linq2Sql stuff lives in here
Car.Data.Tests   --- The tests for the DAL layer

这就是我现在所拥有的,虽然现在可能不是最好的做事方式。

我建议您阅读The Onion Architecture并查看MVC StoreFront视频的灵感;祝你好运。

相关问题