6

私のアプリケーションスタックに渡されたドメインオブジェクトの奇妙なハイブリッドIQueryable<T>とコレクションとして見ることができるものがあります。IList<T>「遅延クエリ」または「遅延読み込み」をできるだけ多く維持しようとしています。私はこれを2つの方法で行います。

  1. LinqToSqlデータレイヤーを使用し、IQueryable<T>リポジトリを介してアプリレイヤーにsを渡す。
  2. 次に、アプリ層がIList<T>sを通過した後、オブジェクト/集計グラフの特定の要素がデリゲートと「チェーン」され、読み込みが延期されます。IQueryable<T>デリゲートのコンテンツでさえソースに依存し、DataContext注入される場合があります。

これは今のところ私にとってはうまくいきます。

やみくもに難しいのは、この設計が実際に機能することを証明することです。つまり。どこかで「怠惰な」部分を打ち負かし、評価/実行が早く行われた場合、すべてが時間の無駄になります。どういうわけかこれをTDDできるようにしたいと思います。

同じソースで動作するデリゲートに適用されるため、デリゲートやスレッドセーフについてはよくわかりません。両方の関数がアプリ/スタックの異なるレベル/レイヤーで動作していることを証明するテストを行えるように、読み込みDataContextを延期する両方の方法(のSQLとデリゲート)をモックしてトレースできるようにしたいと思いますIQueryable<T>

設計が任意の値になるように延期が機能することが重要であるため、(実際の実装とは別に)特定のレベルで設計を壊したときにテストが失敗することを確認したいと思います。これは可能ですか?

4

2 に答える 2

4

morelinqには、それをテストするためのいわゆる「破壊シーケンス」があります。基本的に、列挙されるたびに例外をスローするのは列挙子です。

それは次のように簡単です:

internal sealed class BreakingSequence<T> : IEnumerable<T>
{
    public IEnumerator<T> GetEnumerator()
    {
        throw new InvalidOperationException();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

テストは次のようになります。

   [Test]
    public void XyzIsLazy()
    {
        var source = BreakingSequence<EntityClass>().AsQueryable();

        // inject it as your query source wherever appropriate
        var query = source.Where(x=> true);
        // does not throw, where does not enumerate the sequence
    }
于 2010-05-24T09:56:10.127 に答える
2

JohannesRudolphが答えたのと同じように答えます。あなたは正しいことを考えているように思えます。失敗した場合に追跡するのが難しい重要なことをテストしたいと思っています。

この目的のためにモックを使用することを強くお勧めします。Johannesは、列挙されたときに例外をスローするオブジェクトを提案しました。オブジェクトはテンプレート化されているので、好きなオブジェクトを使用できるはずです。Rhino.Mocks(無料)やTypeMock Isolator(高価)などのモックフレームワークが非常に役立つ場合があります。まだ行っていない場合は、モックフレームワークを調べることを強くお勧めします。

モックを手にすると、特定のテストコードを実行するときに、操作が特定の順序で実行される必要があることを評価できます。モックをプログラムして、実行された操作を記録し、テストの最後に記録を確認することができます。

于 2010-05-28T14:22:35.207 に答える