2016-12-30 4 views
0

私はnj4xを使用していますが、次のような読み込みフィールドを持つクラスがあります。単体テストの読み込みフィールドを模擬/オーバーライドする方法

public class MarketInformation 
    { 
    public readonly double ASK; 
    public readonly double BID; 
    public readonly double DIGITS; 
    public readonly double EXPIRATION; 
    public readonly double FREEZELEVEL; 
    } 

私はこれらのクラスを書くクラスとメソッドの単体テストを書いています。分離/嘲笑のために私はNsubstituteとMicrosoftFakes(主にシム)を使用しています。私はこれらのフィールドをオーバーライドしたいので、メソッドで呼び出されたときにテスト用に予測可能な結果が得られます。 私はこのクラスのシムを生成しましたが、それは私に提供されるすべてがコンストラクタであり、今でもそれを初期化できるようになりました。このクラスの外側からこれらのフィールドを設定する方法はありますか?

+0

私はモック/偽物などについてはあまり知識がありませんが、モッククラス内のフィールド*に*ハードコードされた予測可能な値を設定するというアイデアはありません。つまり、渡す必要はありませんそれを外部から割り当てたり割り当てたりします。モックは、実際のクラスが実装されているのと同じように、あなたが嘲笑している抽象化の実装になっているはずです。 –

+0

@ rory.apモックを実装するのは別のアイデアですが、私はモックとアイソレーションのためのフレームワークを使用しています。モックを実装するには、抽象クラスまたはインタフェースクラスが必要です。ただし、ここでは利用できません。 –

+1

モックできるインターフェイスを作成する必要があります。メンバーは「仮想」である必要があります。 (NS代理はクラスの仮想メンバでしか動作できないので、クラス内の非仮想コードは実際に実行されます!)[参照](http://nsubstitute.github.io/help/creating-a-substitute/) – NtFreX

答えて

0

おそらく、独自のgetプロパティを持つラッパークラスを作成して、スタブまたはシムにする必要があります。スタブ(図示せず)を使用する場合は、独自のインターフェイスを作成することができます。

public class MarketInformationWrapper : MarketInformation 
{ 
    ... 
    public double Ask 
    { 
     get { return ASK; } 
    } 
    ... 
} 
+0

私はそれが私には何の役にも立たないとは思わない。これは、テスト中のクラスまたはメソッドにオブジェクトを渡すことができる場合にのみ機能します。 私が欲しいのは、シムのことです。 私はクラスダミーのシムを作成するのと同じように、shimDummyと言っています。私はちょうど shimDummy.AllInstancesと言うことができます。Ask =(Dummy)=> 5; この方法では、呼び出されるたびに5を取得します。 –

2

それはかなりありませんが、変更する必要があるインスタンスへのアクセスを持っている場合、あなたはthe SetField method of the PrivateObject classを使用することができます。 PrivateObjectクラスはMSユニットテストフレームワークの一部です。例えば

、クラスを考えてみましょう。あなたがそうのような読み取り専用フィールドを設定することができます

public class ClassWithReadOnly 
{ 
    public readonly string Foo; 

    public ClassWithReadOnly() 
    { 
     Foo = "bar"; 
    } 
} 

var test = new ClassWithReadOnly(); 
Console.WriteLine("Before Foo == '{0}'", test.Foo); 
var po = new PrivateObject(test); 
po.SetField("Foo", "oof"); 
Console.WriteLine("After Foo == '{0}'", test.Foo); 

出力は次のようになります。Fooの前

= = 'bar'

Foo == 'oof'の後

関連する問題