【问题标题】:Unit testing with Data Access Layer使用数据访问层进行单元测试
【发布时间】:2011-02-16 01:51:30
【问题描述】:

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

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

所以我有两份 DAL,一份在我的主项目中,一份在测试项目中。如果我为数据层创建一个单独的项目,是否更容易管理这些事情?我不确定哪种方法更好。

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

谢谢

【问题讨论】:

  • 我读到“如果我确实创建了一个数据层项目,我是否会将我的所有 repo 也移动到该项目中?”像您已经在使用以下答案中建议的存储库模式的问题,但显然您还必须在某些测试中进行某种数据库访问?通常这意味着你真的在测试 Linq to SQL,我希望微软的工程师已经这样做了。我建议您避免使用这些方法,并使用 memorycontext 后端测试您的存储库,如 Jason Jones 链接到的文章中所述。

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


【解决方案1】:

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

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

这是在线文章的链接。 Repository Pattern

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-07-04
      • 2014-01-10
      • 1970-01-01
      • 2015-07-13
      • 2013-02-06
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      相关资源
      最近更新 更多