0

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

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 は、上記の DB プロパティを含む AbstractRepository クラスに基づいています。

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

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

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

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

4

1 に答える 1