2010-05-05 49 views
13

用LINQ to SQL DAL编写单元测试的好方法是什么?使用数据访问层进行单元测试

目前我正在做一些数据库测试,需要创建访问数据库的帮助程序方法,但我不想在我的主要数据库中使用这些方法。

所以我得到的是DAL的两个副本,一个在我的主项目中,另一个在Test项目中。如果我为数据层创建单独的项目,管理这些事情会更容易吗?我不确定哪种方法是更好的方法来解决这个问题。

如果我确实创建了一个数据层项目,我是否可以将所有的回购项目移动到该项目中?我不知道如何正确设置图层。

感谢

+0

我看过“如果我创建数据层项目,我是否也会将所有回购项目移动到该项目中?”像你这样的问题已经在使用下面答案中提出的存储库模式,但显然你在某些测试中还必须做某种数据库访问? 通常这意味着你真的在测试Linq到SQL,我期望微软工程师已经完成了这项工作。我建议您避免使用这些方法,并使用一个memorycontext后端测试您的存储库,如Jason Jones链接到的文章中所述。 – AHM 2010-05-05 20:55:59

回答

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视频获取灵感;祝你好运。

6

我将使用Visual Studio杂志2009年9月发表的文章中标题为“消除测试驱动开发中的数据库依赖关系”中的存储库模式。自从我阅读了这篇文章并取得了巨大成功后,我一直在使用这种模式这种模式将有助于解耦您的数据层并编写出好的单元测试。

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

这里是链接到在线文章。 Repository Pattern