如何在Dapper中使用其他IDbConnection方法(使用DapperWrapper)?

时间:2013-08-07 01:59:47

标签: c# .net unit-testing dapper

我正在尝试为使用Dapper方法的存储库创建一些单元测试,但是我无法弄清楚如何让我的代码接受模拟的DbConnection。我发现DapperWrapper acknowledges this problem完成了我所需要的大部分工作,但它提供的IDbExecutor接口不包括我在代码中打开和关闭连接所需的一些基本IDbConnection方法。

例如,下面是我的基本存储库类的属性,它定义了所有存储库中使用的数据库连接,从工厂检索它,并在连接关闭或尚不存在时打开连接。此代码不起作用,因为IDbExecutor不公开Open或Close方法,也不能在接口上有State属性。

private IDbExecutor _db;

protected IDbExecutor Db
{
    get
    {
        if (_db == null)
        {
            _db = DbConnectionFactory.GetConnection();
            _db.Open();
        }
        else if (_db != null && _db.State != ConnectionState.Open)
        {
            _db.Open();
        }
        return _db;
    }

    set
    {
        _db = value;
    }
}

有没有办法扩展或继承IDbExecutor,以便我可以为SQL连接(以及我的模拟连接对象)引用这些方法和属性?或者对整个问题有更好的解决方法吗?

修改

以下是我正在尝试运行的测试示例。我已经创建了一个实现IDbExecutor的TestExecutor类。在这种情况下,它设置为返回我们想要的测试值 - 我们可能会使用工厂根据我们以后的测试需求来创建它。

[Test]
public void TestGetAllDealsSuccess()
{        
    var executor = new TestExecutor();

    var dealRepo = new DealRepository(executor);
    var deals = dealRepo.GetAllDeals();

    //verify that expected deal data was returned
}

DealRepository基于一个AbstractRepository类,它包含上面显示的DB属性。

protected AbstractBaseRepository(IDbExecutor conn)
{
    _db = conn;
}

然后在DealRepository本身,我们对DB对象运行查询:

var results = Db.Query<Deal>("GetDeals", sprocParameters).ToList();

当调用该Db属性时,它会在我上面的原始摘录中运行get代码,这样可以确保对象存在并打开,如果没有则创建一个并打开它。这就是我们遇到问题的地方 - 因为IDbExecutor上不存在Open和State成员。

1 个答案:

答案 0 :(得分:0)

看看DataAbstractions.Dapper

“围绕Dapper和Dapper.Contrib的一种抽象,它还维护行为IDbConnection。”