0

IQueryableが呼び出されたときに自分自身を返したいモック(Moqを使用)を使用してテストを設定して.Where()います:

[SetUp]
public void Setup() {
    mockPocos = new Mock<IQueryable<Poco>>();
    mockPocos.Setup(foo => foo.Where(It.IsAny<Expression<Func<Poco, bool>>>()))
        .Returns(mockPocos.Object);
}

(このようにして、のようなメソッド/プロパティをモックでき、.Countテストされているメソッドがクエリを実行する回数に関係なく、IQueryable制御できる値を返すことがわかります。)

これはコンパイルされますが、実行すると次の例外が発生します。

Tests.PocoTest.TestPocoQueryable:
SetUp : System.NotSupportedException : Expression references a method that does not belong to the mocked object: foo => foo.Where<Poco>(It.IsAny<Expression`1>())

どうすればこれを機能させることができますか?


編集:コメントに応えて、これが私がこのようにMoqを使いたい理由です。

私がテストしているメソッドには、次のようなコードがあります。

public int[] MethodToTest(IQueryable<Poco> pocos, MockableDependency dependency)
{
    var mostRecentUpdate = (from poco in pocos
                                select poco.Date_Last_Updated).Max();
    var recentPocos = pocos.Where(x => x.Date_Last_Updated.CompareTo(mostRecentUpdate) >= 0);

    ///...snip...

    result[0] = SomePrivateCalculation(recentPocos.Count);
    result[1] = dependency.DoADifferentCalculation(recentPocos);
}

私はすでにをモックしているので、実際に何が入ってMockableDependencyいるかを心配する必要はありません。ただし、の値を制御できるようにしたいので、アクセスする前に何回クエリを実行しても同じ値が返されることを知りたいです。PocopocosrecentPocos.Countpocos.Count

4

1 に答える 1

1

MattiasGは解決策を示唆しています。期待する.Countを与える既知の結果で常にクエリを生成するIQuerablepocosを提供する必要があります。

したがって、ここのコードに示されていないのは、正しく行われているということです。適切なアサーションを作成できるデータを提供するために、pocosを渡すメソッドもモックする必要があります。

テストのバランスをとるのは難しいです。それは本当に芸術の形です。ただし、moqを使用している場合は、個々のメソッド内で何が起こっているかではなく、高次の「作業単位」に焦点を当てる必要があります。

言い換えれば、これを言い換えると。Countが常に5を返すように管理したとします。次に、依存関係メソッドでCountが5であるかどうかをチェックするテストがあります。です。何を成し遂げましたか?そうですね、Countがintを返すと断言できますが(これはすでに機能していることはわかっています)、アプリケーションコードを実際にテストしたことはありません。

しかし、実際の質問に答えるには、次のようにします。-IQuearble <>へのコンバーターまたはラッパークラスを使用して、新しいインターフェイスIMyOwnCustomMockableQuery <>を作成し、次に、不要なすべての呼び出しを転送するIMyOwnCustomMockableQuery<>の新しいlinq実装を作成する必要があります。 IQuearble<>の拡張機能をモックします。

確かに、これは非常に複雑であり、独自のテストが必要になります。=)アプリケーションをテストしないテストのモックアップをテストするための多くの作業のようです。このアプローチはお勧めしません。

于 2013-01-19T11:47:23.260 に答える