在Moq中模拟测试对象的方法?

时间:2014-01-30 15:39:37

标签: c# mocking moq

我想测试我的类的方法A,但是没有调用通常由A调用的实际方法B.那是因为B有很多外部交互,我现在不想测试。

我可以为B调用的所有服务创建模拟,但这是相当有用的。我宁愿只是模拟B并让它返回样本数据。

这可能与Moq框架有关吗?

1 个答案:

答案 0 :(得分:35)

是的,抓住了! 您必须确保方法B是虚拟的,并且可以覆盖。

然后,设置mock以在没有提供设置时调用基本方法。然后设置B,但不设置A。由于未设置A,因此将调用实际实现。

var myClassMock = new Mock<MyClass>();
myClassMock.Setup(x => x.B()); //mock B

myClassMock.CallBase = true;

MyClass obj = myClassMock.Object;
obj.A(); // will call the actual implementation
obj.B(); // will call the mock implementation

在幕后,Moq将动态创建一个扩展MyClass并覆盖B的类。