Dapperで追加のIDbConnectionメソッドをサポートする方法(DapperWrapperを使用)

.net c# dapper unit-testing

質問

私はDapperメソッドを使用するリポジトリ用の単体テストをいくつか作成しようとしていますが、私のコードでモックされたDbConnectionを受け入れる方法を見つけ出すのに問題があります。 DapperWrapper がこの問題を認識し、必要なもののほとんどを達成していることがわかりましたが、それが提供する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;
    }
}

SQL接続のために(そして私のモック接続オブジェクトの中で)これらのメソッドとプロパティを参照できるようにIDbExecutorを拡張または継承する方法はありますか?それとも、この問題全体へのより良いアプローチはありますか?

編集する

下記は私が実行しようとしているテストの例です。 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は、上記のDBプロパティを含むAbstractRepositoryクラスに基づいています。

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

次に、DealRepository自体で、DBオブジェクトに対してクエリを実行します。

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

そのDbプロパティが呼び出されると、上記の最初の抜粋でgetコードが実行されます。これにより、オブジェクトが存在して開かれていることを確認し、存在しない場合は作成して開きます。 OpenメンバーとStateメンバーはIDbExecutorには存在しないため、それが問題になります。

人気のある回答

DataAbstractions.Dapperを見てください

「DbperとDapper.Contribの周りの軽い抽象化で、動作IDbConnectionも維持しています。」



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow