1. ホーム
  2. c#

[解決済み] Moqを使って拡張メソッドをモックするにはどうしたらいいですか?

2023-02-17 13:24:25

質問

拡張メソッドの結果に依存するテストを書いていますが、将来その拡張メソッドが失敗しても、このテストが壊れないようにしたいと思っています。その結果をモック化することは当然の選択のように思われますが Moqは静的メソッドをオーバーライドする方法を提供しないようです。 (拡張メソッドの要件)を提供しないようです。Moq.ProtectedとMoq.Stubで同様のアイデアがありますが、彼らはこのシナリオのために何も提供していないようです。私は何かを見逃していますか、または私はこれについて別の方法で行くべきですか?

以下は、通常の方法で失敗する些細な例です。 オーバーライドできないメンバに対する無効な期待値です。 . これは拡張メソッドをモックする必要がある悪い例ですが、そうする必要があります。

public class SomeType {
    int Id { get; set; }
}

var ListMock = new Mock<List<SomeType>>();
ListMock.Expect(l => l.FirstOrDefault(st => st.Id == 5))
        .Returns(new SomeType { Id = 5 });

TypeMockのジャンキーは、Isolatorを代わりに使うことを勧めるかもしれません。目隠しして酔っぱらった状態でTypeMockが仕事をするように見えるので、その努力には感謝しますが、我々の予算はすぐには増えないのです。

どのように解決するのか?

拡張メソッドは静的メソッドを装っているだけです。Moq や Rhinomocks のようなモッキングフレームワークはオブジェクトのモックインスタンスしか作成できないので、静的メソッドのモッキングは不可能です。