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

13

如何以LINQ to SQL数据访问层的方式编写良好的单元测试?

目前我正在进行一些数据库测试,并需要创建访问数据库的助手方法,但我不希望这些方法出现在我的主要代码库中。

所以我有两个DAL的副本,一个在我的主项目中,另一个在测试项目中。如果我创建一个独立的数据层项目,管理这些东西会更容易吗?我不确定哪种方法更好。

如果我确实创建了一个数据层项目,那我是否也应该将所有的repo都移到那个项目中?我不确定如何正确设置层次结构。

谢谢


我读到了“If I do create a data layer project would I move all my repo's to that project as well?”这个问题,就好像你已经在使用下面答案中建议的存储库模式,但显然你还需要在一些测试中进行某种类型的数据库访问?通常这意味着你正在真正测试Linq to SQL,而我希望微软的工程师已经完成了这项工作。我建议你避免使用那些方法,并使用内存上下文后端来测试你的存储库,就像Jason Jones链接中所描述的那样。 - AHM
2个回答

6
我会使用《Visual Studio杂志》2009年9月份文章中提到的“在测试驱动开发中消除数据库依赖”的存储库模式。自从我读了这篇文章以来,一直在成功地使用这种模式。这种模式将有助于解耦数据层并编写良好的单元测试。
这将要求您采用n层架构并创建一个单独的数据层,但从长远来看,这是值得的。
这里是在线文章链接。 存储库模式

5

我正在使用Linq2Sql作为我的数据访问层(DAL),并将其作为单独的项目。在我的领域项目中,我有一个存储库接口,然后我使用自定义的Linq2SqlCarRepository在我的DAL项目中实现它,这个类封装了生成的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商店前端视频以获取灵感;祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接