2016-10-26 6 views
0

C#ユニットテストプログラムでNSubstitutionを使用しようとしています。C#のメソッドのNS置換?

私はmehtodの内部と呼ばれるメソッドに代入をしようとしています。ここ は一例です:

public class operation 
{ 
    public int addition(int a, int b) 
    { 
    return (a + b); 
    } 
} 

public class anotherClass 
{ 
    public int increment(int ax, int bx) 
    { 
    operation loc = new operation(); 
    ax = loc.addition(ax,bx); 
    return (ax + 1); 
    } 
} 

は、それが私の主な機能の増分()メソッドを呼び出し、さらに()メソッドに置換を適用することは可能ですか?

increment()メソッドで呼び出したときに、add()メソッドで強制的に戻り値を設定したいとします。例えばecxeption throwを強制する。

また、私はコードを編集することができないので、インターフェイスの実装を追加することは良い解決策ではありません。

+0

あなたの特定の問題を明確またはハイライトに追加の詳細情報を追加してください

operation.addition(Arg.Any<int>(), Arg.Any<int>()).Throws(new Exception()); 

、コンストラクタを介して、それを渡す:

public interface Ioperation { int addition(int a, int b); } public class operation : Ioperation { public int addition(int a, int b) { return (a + b); } } public class anotherClass { Ioperation _operation; public anotherClass(Ioperation operation) { _operation = operation; } public int increment(int ax, int bx) { operation loc = new operation(); ax = loc.addition(ax, bx); return (ax + 1); } } 

は、その後、あなたが次のようにNSubstituteでそれを模擬することができます。例のコードは次のようになりますまさにあなたが必要とするものです。現在書かれているとおり、あなたが求めていることを正確に伝えるのは難しいです。この質問を明確にする方法については、How to Askページを参照してください。 – mybirthname

+0

私は目的をより明確にしました。 @mybirthname –

+0

NSubstituteは、既存のオブジェクトや "通常の" .NETオブジェクトを変更しないで、メソッドをオーバーライドできる新しいオブジェクトを返します(仮想メソッドを使用してインターフェイスまたはクラスを置き換えた場合)。問題のメソッドの中で新しい 'operation'を構築しているので、その新しいオブジェクトを変更することはできません。まず、NSubstituteに置換の変形を作成するように依頼しなければなりません。独自のオブジェクトを作成する代わりに、この新しいオブジェクトを使用するようにしてください。 –

答えて

0

あなたがテストしている方法(increment)内operationの新しいインスタンスを作成しているので、additionにプロキシにお電話をNSubstitutを取得する方法はありません - あなたは多くの理由のために(方がいいでしょう、1あなたの機能を代用することができるようにInversion of controlを使用して)テスト容易であるの:

public interface IOperation 
{ 
    int addition(int a, int b); 
} 

public class operation : IOperation 
{ 
    public int addition(int a, int b) 
    { 
    return (a + b); 
    } 
} 

public class anotherClass 
{ 
    private readonly IOperation _operation; 
    public anotherClass(IOperation operation) 
    { 
     _operation = operation; 
    } 

    public int increment(int ax, int bx) 
    {   
    ax = _operation.addition(ax,bx); 
    return (ax + 1); 
    } 
} 

そのように、あなたのアプリケーションを実行するときanotherClassにごoperationクラスのインスタンスを渡し、あなたのユニットテストでNSubstitute.Substitute.For<IOperation>()を渡すことができます。あなたはそれはあなたが望むものは何でも返してもらうためにそのモックを使用することができます。

var mockOperation = NSubstitute.Substitute.For<IOperation>(); 
mockOperation.addition(Arg.Any<int>(), Arg.Any<int>()).Return(/*...*/); 
+0

要するに、私がテストしているコード(インターフェイスの追加)を変更できない場合、それを行うことは不可能ですか? –

+0

@AngeloCharl私はコードを変更することなくそれを行う方法を考えることはできません - クラスが異なるアセンブリにある場合は、 '操作 'をスタブして元のアセンブリの代わりにそれを参照することがありますが、あまりにも厄介なtbh – KMoussa

0

あなたが操作クラスにanotherClassの依存関係に渡す必要があり、これを行うには。これはさまざまな方法で行うことができます。そのうちの1つはコンストラクタを使用して注入しますが、第1に、NSubstituteを使用してそれをモックできるようにIOperationインターフェイスを追加する必要があります。