0

以下のリポジトリコードをモックしようとしています:

var simulatorInstance = bundleRepository
    .FindBy<CoreSimulatorInstance>(x => x.CoreSimulatorInstanceID == instanceID)
    .Single();

しかし、「シーケンスに要素が含まれていません」というエラーが表示されます。を に変更しようとしました.SingleSingleOrDefault、それは を返しますnull

単体テストでは、次を使用してリポジトリをモックしました。

これは動作しません

this.mockedRepository.Setup(
    x => x.FindBy<CoreSimulatorInstance>(
        z => z.CoreSimulatorInstanceID == 2))
            .Returns(coreSimulatorInstancesList.AsQueryable());

Is.Anyレコードが 1 つしかないため、これは今のところ を使用して機能します

this.mockedRepository.Setup(
    x => x.FindBy<CoreSimulatorInstance>(
        It.IsAny<Expression<Func<CoreSimulatorInstance, bool>>>()))
            .Returns(coreSimulatorInstancesList.AsQueryable());

を使用してコードをモックしたい.Single

4

1 に答える 1

0

私の推測では、Moq を使用してリポジトリのFindByメソッドをセットアップし、テストの実行時にビジネス ロジック コードがモックされたメソッドにヒットするようにしています。

問題は、Moq が、モックのセットアップ中に提供したパラメーターと、ビジネス ロジック コードの実行中に提供したパラメーターを一致させることができず、その結果、モックされたリポジトリ メソッドが実行されcoreSimulatorInstancesListず、返されないことだと思います。

セットアップ中にMoqに提供したパラメーターは式であるため

z => z.CoreSimulatorInstanceID == 2

ビジネス ロジック コードがinstanceIDof 2 で実行される場合でも

x => x.CoreSimulatorInstanceID == instanceID

モックで設定したものと同等の式になりますが、それらは異なる式であるため、まだ一致していません。これらは 2 つの異なる式オブジェクトです。Moqがそれらが同等であることを認識し、それに基づいてモックされたメソッドと一致する方法はないと思います。

私はIs.Anyアプローチで行きます。より徹底したい場合は、この場合、カスタムの偽のリポジトリ クラスを手動でビルドする必要があると思います。

于 2013-05-01T16:04:52.307 に答える