如何模拟 class 实现多个接口并将模拟对象转换回 class 类型?

How to mock class implementing multiple interfaces and cast the mock object back to the class type?

计算器class实现了多个接口。

public class Calculator : IAdd, ISubtract, IMultiply, IDivide
{
    ...
}

我如何使用 Moq 模拟此 class,并将其传递给 MyMethod?

public int MyMethod(Calculator calculator)
{
    ...
}

例如,我嘲笑了 IMultiply,并试图将其转换为计算器,但它变成了 null。

为了直接回答最初的问题,Calculator class 可以原样模拟

Mock<Calculator> mock = new Mock<Calculator>();

Moq 允许提取特定派生类型以使用 As<T>()

进行设置
Mock<IMultiply> multiplyMock = mock.As<IMultiply>();
multiplyMock.Setup(...);

var subject = new MyClass();

subject.MyMethod(mock.Object);

在设计方面,我建议 Calculator 从它自己的界面开始。

创建单一界面以聚合功能

public interface ICalculator: IAdd, ISubtract, IMultiply, IDivide {

}

Calculator从中得到

public class Calculator : ICalculator {
    //...
}

方法依赖于抽象

public int MyMethod(ICalculator calculator) {
    //...
}

并且在测试时,可以根据需要轻松模拟界面。

//Arrange
var calculator = Mock.Of<ICalculator>(); //and configure expected behavior

var subject = new MyClass();

//Act
var result = subject.MyMethod(calculator);