2017-07-19 4 views
2

私はmockingにNsubstituteを使用しています。Nsubstitute:ジェネリッククラス内に偽物を作成する方法

型「TValue」は、参照型である必要があります。

public class Tester<TValue> 
    where TValue: IValue 
{ 
    // this is used inside the class in other methods 
    private TValue CreateValue() 
    { 
     return Substitute.For<TValue>(); // here the compiler has an error 
    } 
} 

このコードは、マークされた場所でコンパイルエラーを与える:私は、一般的な属性を偽装し、一般的なクラスを作成するコードを減らすために、 するためには、ジェネリック型またはメソッドにパラメータ「T」として使用 「Substitute.For(paramsはオブジェクト[])は」

これは、明らかと思わSubstituteクラスの実装ため次のようになります。Substitute.For<IValue>()とエラーは発生しません:私はについてです疑問に思って何

public static class Substitute 
{ 
    public static T For<T>(params object[] constructorArguments) where T : class; 
} 

、なぜそのようなコードが可能です。誰でも、偽の権利でジェネリッククラスを行う方法を説明することはできますか?

答えて

1

以下のコードは動作するはずです:

public class Tester<TValue> 
    where TValue : class, IValue 
{ 
    // this is used inside the class in other methods 
    private TValue CreateValue() 
    { 
     return Substitute.For<TValue>(); // here the compiler has an error 
    } 
} 

The type must be a reference type in order to use it as parameter 'T' in the generic type or methodを読む価値があるかもしれません。

Substitute.Forは参照型(class)を指定する必要があるためです。したがって、(あなたのような)一般的な呼び出し元は、同じclassという制約を指定する必要があります。

+0

ご回答ありがとうございます。 NSubstituteはクラスをジェネリックパラメータとして必要とするという制約を見ました。私は、Substitute.For ()でインタフェースを使用することが可能であると思った。私のケースでは、 'TValue'ジェネリックパラメータをクラスに制約することはできません。なぜなら、私はそれがインターフェイス用に必要なためです。 – scher

+0

'IValue'のインターフェース定義(つまりファイル)と' IValue'を実装するすべてのクラス/構造体のファイルで投稿を更新できますか? – mjwills

+0

私のコードサンプルの文脈における 'class'は、「インタフェースではなくクラス」を意味するのではなく、「クラスではなくクラス」を意味することに注意してください。あなたの目的のために上記のコードを試しましたか?それは動作しましたか? – mjwills

関連する問題