尽管我同意@Paul 的回答是推荐的方式,但我只想添加一种由moq
自我提供的替代方式。
因为SomeClass
它abstract
确实是可模拟的,但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);