如何模拟 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);
计算器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);