【问题标题】:Create System.Data.Linq.Table in Code for Testing在测试代​​码中创建 System.Data.Linq.Table
【发布时间】:2010-03-18 20:59:54
【问题描述】:

我有一个用于 Linq-to-Sql 的适配器类:

public interface IAdapter : IDisposable
{
    Table<Data.User> Activities { get; }
}

Data.User是Linq-to-Sql定义的对象,指向持久化中的User表。

实现如下:

public class Adapter : IAdapter
{
    private readonly SecretDataContext _context = new SecretDataContext();

    public void Dispose()
    {
        _context.Dispose();
    }

    public Table<Data.User> Users
    {
        get { return _context.Users; }
    }
}

这使得在单元测试中模拟持久层变得容易,因为我可以返回任何我想要的用户数据集合 (Rhino.Mocks):

Expect.Call(_adapter.Users).Return(users);

问题是我无法创建对象“用户”,因为无法访问构造函数并且类表是密封的。我尝试的一种选择是让 IAdapter 返回 IEnumerable 或 IQueryable,但问题是我无法访问 ITable 提供的方法(例如 InsertOnSubmit())。有没有办法在单元测试场景中创建假表,这样我就可以成为一名快乐的 TDD 开发人员?

【问题讨论】:

    标签: unit-testing linq-to-sql


    【解决方案1】:

    我目前的解决方案是将我想要的功能从 Table 包装到 TableWrapper 类中:

    public interface ITableWrapper<TEntity> 
        where TEntity : class
    {
        IEnumerable<TEntity> Collection { get; }
        void InsertOnSubmit(TEntity entity);
    }
    

    下面是实现:

    public class TableWrapper<TEntity> : ITableWrapper<TEntity> 
        where TEntity : class
    {
        private readonly Table<TEntity> _table;
    
        public TableWrapper(Table<TEntity> table)
        {
            _table = table;
        }
    
        public IEnumerable<TEntity> Collection
        {
            get { return _table; }
        }
    
        public void InsertOnSubmit(TEntity entity)
        {
            _table.InsertOnSubmit(entity);
        }
    }
    

    所以现在我可以轻松地模拟 Collection 中的数据,并保留 InsertOnSubmit 的功能(以后可以添加我需要的任何其他功能)。

    【讨论】:

      【解决方案2】:

      我已经成功地使用数据访问层生成域对象集合,然后使用 linq 到对象。 然后,被测对象只与 List 相关,这很容易进行单元测试。

      我不喜欢逻辑实体应该具有数据访问层依赖项。他们应该停在服务层,即使在那里。我通常选择服务层调用数据访问对象以获取列表的模型,将该列表传递给需要它的任何逻辑对象(如有必要,使用 linq-to-objects 过滤掉相关数据并将其注入到eiter一个平面列表、字典或对象模型)。

      业务对象变得非常可测试,即使它们没有受益于推断数据模型的丰富性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-21
        • 2019-04-20
        • 2016-04-12
        • 1970-01-01
        • 2020-04-25
        • 1970-01-01
        相关资源
        最近更新 更多