Answers:
您可以查看是否已经通过使用验证调用了您模拟的方法,例如:
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的答案是推荐的解决方法,但我只想添加一种由moq
自我提供的替代方法。
因为SomeClass
是abstract
它确实是mockable,但public void SomeMehod()
并非如此。关键是找到模拟方法并以某种方式调用该方法,然后使用CallBase
将该调用传播到SomeOtherMethod()
。听起来可能很hack,但是本质上很简单。如果无法进行建议的重构,则可以使用它。
// 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);