2012-02-23 15 views
9

で保護された一般的な方法は簡単ですモック:部品番号で保護された仮想(非ジェネリック)メソッドを模擬するために部品番号

public class MyClass 
{ 
.... 
     protected virtual int MyMethod(Data data){..} 
} 

そして、それを模擬する:

myMock.Protected().Setup<int>("MyMethod", ItExpr.Is<Data>(... 

私は見つけることができませんでした保護されたメソッドがgenericの場合、同じ方法を使用する方法:

protected virtual int MyMethod<T>(T data) 

オーバーレイするためのラッパークラスを使用する方法その方法は、非常に高く評価されています。

+0

できるかどうかわかりません。最初に試みたのは、MyMethod'1 [T]をSetup()に渡すことでしたが、それはそれをだますようには見えませんでした。とにかくそれを試してみてください。 –

答えて

6

私はソースをチェックしましたし、それががサポートされていない部品番号とからかっ保護された一般的な方法だ:

Protected()方法は、あなたの方法を取得するには、次のメソッドを使用するクラスProtectedMock<T>のインスタンスを作成しますモックにしたい:

private static MethodInfo GetMethod(string methodName, params object[] args) 
{ 
    return typeof(T).GetMethod(
      methodName, 
      BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, 
      null, 
      ToArgTypes(args), 
      null); 
} 

それは(MSDNが異なっ述べている)参照、ジェネリックで素晴らしいプレーしていないあざけるための方法を取得するためにType.GetMethodを使用していますが、GetMethod

GetMethod for generic method

Get a generic method without using GetMethods

サイドノート:保護されたメンバーをからかっ私の意見で は、コードのにおいである、と私はむしろそれが部品番号ではサポートされていないというの横に(私のデザインをリファクタリングしてとにかくそれを避けるためにしようとするだろう)。

+0

私は完全にコードのにおいに同意します。しかし、より複雑なシナリオでは、これは簡単にテストできます。私。たくさんのメソッドに対して非常に "類似の"機能を持っていて、公開されている部分がそれらを渡すためのパラメータを適切にマッピングしているかどうかを確認したいだけです。 –