2012-07-28 16 views
9

は私がMoqを使用してクラス全体ではなくクラス上で1つのメソッドをモックしますか?

public interface IMyInterface 
{ 
    string MethodA(); 
    void MethodB(); 
} 

public class MyClass : IMyInterface 
{ 
    public string MethodA() 
    { 
     // Do something important 
    } 

    public void MethodB() 
    { 
     string value = MethodA(); 
     // Do something important 
    } 
} 

は、私はユニットテストMethodBしたいクラスを持っているが、私はまだ部品番号を使用してMethodBに呼び出している間、私はMethodAをモックする方法について考えてトラブルを抱えています。 Moqはクラスではなくインターフェイスをモックしているので、mock.Object.MethodB()と呼ぶことはできません。

これは可能ですか?もしそうなら、どうですか?

+1

1つの発言:実際にはMoqを使用すると、クラスをモックすることができますが、クラスにはいくつかの要件があります。クラスは封印できません。モックされたメソッドは仮想としてマークされなければならない。また、静的メソッドではありません。 – Artiom

答えて

4

私は考えられません。私はそれをしたくないかもしれない。

MyClassの動作をテストしていますが、IMyInterface を実装することは、MethodAとMethodBの動作をテストすることと多少関連していません。必要に応じて実装することを期待するインターフェースをクラスが実装していることを確認する別個のテストを行うことができます。 MyClass.MethodBのテストは、Semock-mockedオブジェクトではなくMyClassのインスタンスで行う必要があります。

MethodAの動作が依存関係であると思われる場合は、実際にクラスから明示的に抽出することができます。 MethodA(単に依存関係に委任する)とMethodB(依存関係を使用してより多くのことを行う)の両方をテストすることができます。

1

モック依存関係を簡単に(またはすべて)インスタンス化できません。
MyClassはテスト中のクラスなので、嘲笑されるべきではありません(あなたは偽の値をテストしたくありません)。
IFooインターフェイスを実装するFooクラスでMethodAプロパティを使用しているMyClass.Fooプロパティがある場合は、このFooプロパティを使用して、ブレーク依存関係をモックできます。

関連する問題