web-dev-qa-db-ja.com

Moqを使用してメソッドが呼び出されるかどうかを判断する

私は、より高いレベルのメソッドを呼び出すと、メソッド呼び出しが発生することをテストできることを理解しています:すなわち:

public abstract class SomeClass()
{    
    public void SomeMehod()
    {
        SomeOtherMethod();
    }

    internal abstract void SomeOtherMethod();
}

SomeMethod()を呼び出すと、SomeOtherMethod()が呼び出されることを期待しています。

この種のテストはモックフレームワークで利用できると思いますか?

153
Owen

あなたがモックしたもののメソッドが検証を使用して呼び出されたかどうかを見ることができます、例えば:

static void Main(string[] args)
{
        Mock<ITest> mock = new Mock<ITest>();

        ClassBeingTested testedClass = new ClassBeingTested();
        testedClass.WorkMethod(mock.Object);

        mock.Verify(m => m.MethodToCheckIfCalled());
}

class ClassBeingTested
{
    public void WorkMethod(ITest test)
    {
        //test.MethodToCheckIfCalled();
    }
}

public interface ITest
{
    void MethodToCheckIfCalled();
}

行にコメントを付けたままにすると、Verifyを呼び出したときにMockExceptionがスローされます。コメントが解除されている場合、パスします。

181
Paul

いいえ、模擬テストでは、注入可能な特定のテスト可能なデザインパターンを使用していることを前提としています。あなたの場合、あなたはテストすることになりますSomeClass.SomeMethodSomeOtherMethodは、インターフェースが必要な別のエンティティに実装されなければなりません。

SomeclassコンストラクターはNew(ISomeOtherClass)のようになります。次に、ISomeOtherClassをモックし、そのSomeOtherMethodに期待値を設定して呼び出し、期待値を検証します。

6
Val