2011-12-16 4 views
3
interface ISample 
{ 
    int Sum(int a,int b); 
    int Multiplication(int x,int a,int b); 
} 

class Sample 
{ 
    public int Sum(int a,int b) 
    { 
     return a+b; 
    } 

    public int Multiplication(int x,int a,int b) 
    { 
     return x*Sum(a,b); 
    } 
} 

私は乗法をテストしたいと思います。しかし、乗法の方法をテストするには、sumメソッドを嘲笑する必要があります。どのように私は合計法を模擬するのですか?このようなことは可能でしょうか?クラス内で2つのメソッドを偽装する方法

+0

あなたは何かをモックする必要はありません - ISample'は、それだけに依存しているクラスで必要とされる 'あざけります。 – Lee

+0

@ここのメソッドは依存関係がありません。 – sinanakyazici

答えて

3

他にも、別々のインターフェイスを使用できます。例

あなたのテストコードで
interface ISum{ 

    int Sum(int a, int b); 
} 

interface ISample 
{ 
    int Multiplication(int x, int a, int b); 
} 

public class Sample : ISample 
{ 
    ISum _sum; 
    public Sample(ISum sum) 
    { 
     _sum = sum; 
    } 

    int Multiplication(int x, int a, int b) 
    { 
     return x*_sum.Sum(a,b); 
    } 
} 

について:

[TestFixture] 
public class TestSample 
{ 
    [Test] 
    public void TestSample() 
    { 
     var mockSum = new Mock<ISum>(); 
     mockSum.Setup(); // fill this what you want 
     var sampleObj = new SampleObj(mockSum.Object); 
     //Do Some Asserts 
    } 

} 
4

私はSumを独立してテストし、乗算テストではSumが動作すると仮定します。合計テストでも動作すれば、乗算にも有効です。また、何人かは、乗算がテストでどのようにそのことを知るべきではないと主張します。 Sumに依存しない別のアルゴリズムを後で使用するとどうなりますか?

4

あなたがテストしているクラスをモックしないで、あなたが依存しているクラスをモックします。

実際には、Sum()メソッドとは独立してMultiplication()メソッドをテストできるようにするには、それを独自のインターフェイスに分け、Sampleクラスにそのインターフェイスのインスタンスを提供する必要があります。合計を実行するために使用できます。

代わりに、まずSum()メソッドをテストするだけです。 Sum()メソッドがすべてのテストに合格した場合、それが正しく動作することが合理的に確かめられます。正しく動作することがわかったら、Multiplication()メソッドをテストしてその知識に基づいて構築することができます。

+0

良い答えは、代わりに示唆されている通り - テストの実行順序が決して保証されないので、何かを最初にテストすることはできません(同じテスト方法で行われていない限り)。 – Paul

+0

はい、あなたは完全にそうです。私は、乗法方法のテストを書く前に、まずSumメソッドのテストを書くことを意味しました。(もちろん、この場合でも理論的にはSumメソッドが壊れて、Multiplicationテストが失敗する可能性がありますが、少なくともSumテストに失敗することは間違いありません) –

1

あなたが話していることを達成する可能性のある唯一のツールはMolesです。あなたがMoqを使っているなら、これはできません。しかしどちらにしても、あなたのクラスをユニットとしてテストすることをお勧めします。つまり、Sum()のテストを書いてその動作に満足すれば、Multipication()のテストを書くことに移り、問題があれば必要に応じてSum()またはMultiplicationで修正します。

2

Sumへの呼び出しを '模擬'しようとするのではなく、Sumへの呼び出しが実装の詳細なので、それを独立してテストするだけです。しかし、あなたの実際のコードはやや複雑であるならば、あなたはFuncを受け取るオーバーロードを追加することができます。

public int Multiplication(int x,int a,int b) 
{ 
    return this.Multiplication(x, a, b, (a, b) => a + b); 
} 

public int Multiplication(int x,int a,int b, Func<int, int, int> sumFunc) 
{ 
    return x * sumFunc(a, b); 
} 

次に、あなたのテストで独自のsumFuncインスタンスを提供することができます。

また、Sumを仮想にして、独自の実装に置き換える必要があるテストメソッドでオーバーライドすることもできます。

2

もう1つの方法は、インターフェイスを明示的に実装することです。次に、メソッドごとに共有してテストできるプライベート関数を導入する必要があります。

private int Sum(int a, int b) 
{ 
    return a+b; 
} 

int ISample.Sum(int a,int b) 
{ 
    return Sum(a,b); 
} 

int ISample.Multiplication(int x,int a,int b) 
{ 
    return x*Sum(a,b); 
} 
関連する問題