【问题标题】:How to mock class implementing multiple interfaces and cast the mock object back to the class type?如何模拟实现多个接口的类并将模拟对象转换回类类型?
【发布时间】:2020-01-09 13:46:55
【问题描述】:

Calculator 类实现了多个接口。

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

我将如何使用 Moq 模拟这个类,并传递给 MyMethod?

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

例如,我模拟了 IMultiply,并尝试将其强制转换为 Calculator,但它变成了 null。

【问题讨论】:

  • 因为MyMethod 需要一个Calculator,你必须创建一个Mock<Calculator>

标签: c# .net class interface moq


【解决方案1】:

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

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

Moq 允许提取特定派生类型以使用 As&lt;T&gt;() 进行设置

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2015-10-20
    相关资源
    最近更新 更多