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

Ant*_*ine 22 c# moq mocking

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

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

这可能与Moq框架有关吗?

dca*_*tro 37

这是一个抓住!您必须确保方法B是虚拟的并且可以覆盖.

然后,设置模拟以在未提供设置时调用基本方法.然后你设置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
Run Code Online (Sandbox Code Playgroud)

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

  • 确切地说,如果`virtual`方法`B`是`protected internal`或`public`,那将是最简单的. (2认同)