回答:
以下の例のように、Verifyを使用して、モックしたもののメソッドが呼び出されたかどうかを確認できます。
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がスローされます。コメントされていない場合は合格です。
@Paul の回答が推奨される方法であることには同意しますが、自分で提供する別の方法を1つ追加するだけですmoq
。
以来でSomeClass
あるabstract
ことは確かmockableですが、public void SomeMehod()
ではありません。ポイントは、そのメソッドをモックして何らかの方法で呼び出す方法を見つけ、それを使用しCallBase
てへの呼び出しを伝達することSomeOtherMethod()
です。ハックのように聞こえるかもしれませんが、本質的には単純です。提案されたリファクタリングが不可能な場合に使用できます。
// This class is used only for test and purpose is make SomeMethod mockable
public abstract class DummyClass : SomeClass
{
public virtual void DummyMethod() => base.SomeMethod();
}
次にDummyMethod()
、CallBase
フラグを設定することにより、コールを伝播するように設定できます。
//Arrange
var mock = new Mock<DummyClass>();
mock.Setup(m => m.DummyMethod()).CallBase();
//Act
mock.Object.SomeMethod();
//Assert
mock.Verify(m => m.SomeOtherMethod(), Times.Once);