95

私は拡張メソッドの結果に依存するテストを書いていますが、その拡張メソッドの将来の失敗がこのテストを破ることを望んでいません。その結果をあざけるのは当然の選択のように見えましたが、 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 });

代わりにIsolatorを使用することを提案する可能性のあるTypeMockジャンキーについては、TypeMockが目隠しをして醜い仕事をすることができるように見えるので、努力に感謝しますが、予算はすぐには増えません。

4

6 に答える 6

77

拡張メソッドは、変装した静的メソッドにすぎません。MoqやRhinomocksのようなモックフレームワークは、オブジェクトのモックインスタンスのみを作成できます。つまり、静的メソッドをモックすることはできません。

于 2009-02-18T18:02:25.757 に答える
16

この質問が約 1 年間アクティブになっていないことは知っていますが、Microsoft はMolesと呼ばれるこれを正確に処理するためのフレームワークをリリースしました。

ここにもいくつかのチュートリアルがあります:

  • DimeCasts.net
  • Nikolai Tillman のチュートリアル

  • 于 2010-04-28T20:35:57.927 に答える
    15

    モックする必要のある拡張メソッドのラッパークラスを作成しました。

    public static class MyExtensions
    {
        public static string MyExtension<T>(this T obj)
        {
            return "Hello World!";
        }
    }
    
    public interface IExtensionMethodsWrapper
    {
        string MyExtension<T>(T myObj);
    }
    
    public class ExtensionMethodsWrapper : IExtensionMethodsWrapper
    {
        public string MyExtension<T>(T myObj)
        {
            return myObj.MyExtension();
        }
    }
    

    次に、テストのラッパーメソッドをモックし、IOCコンテナーを使用してコードを記述できます。

    于 2010-10-01T14:30:00.583 に答える
    4

    拡張メソッドについては、通常、次のアプローチを使用します。

    public static class MyExtensions
    {
        public static Func<int,int, int> _doSumm = (x, y) => x + y;
    
        public static int Summ(this int x, int y)
        {
            return _doSumm(x, y);
        }
    }
    

    _doSumm をかなり簡単に注入できます。

    于 2015-01-29T16:23:49.207 に答える