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

cho*_*obo 13 c# asp.net-mvc unit-testing n-tier-architecture linq-to-sql

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

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

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

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

谢谢

Jas*_*nes 6

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

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

这是在线文章的链接. 存储库模式


dan*_*ain 5

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

例如.在Car.Core项目中

 public interface ICarRepository
 {
    IQueryable<Car> GetAllCars();
    void Add(Car);
 }
Run Code Online (Sandbox Code Playgroud)

然后我有一个接口的实现,它包含对生成的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;
    }
Run Code Online (Sandbox Code Playgroud)

然后,我有一个测试项目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
Run Code Online (Sandbox Code Playgroud)

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

我建议您阅读The Onion Architecture并查看MVC StoreFront视频以获取灵感; 祝好运.