2014-01-30 35 views
21

我想测试我的类的方法A,但不调用通常由A调用的实际方法B.这是因为B有很多外部交互,我现在不想测试。模拟Moq中正在测试的主题的方法?

我可以为B所调用的所有服务创建嘲笑,但这是相当的工作。我宁愿嘲笑B,让它返回样本数据。

Moq框架有可能吗?

回答

28

这是,赶上! 您必须确保方法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 

屁股的场面,起订量,动态地创建一个扩展MyClass和覆盖B类。

+2

准确地说,如果'virtual'方法'B'是'protected internal'或'public',它将会是最简单的。 –

+0

问题:CallBase = true是什么;做? – Hace

+1

@Hace如果我没有记错,它会告诉模拟对象调用'MyClass'中定义的方法,除非提供了明确的设置。如果你没有调用'CallBase = true',那么无论是否提供了明确的设置,Moq都会调用虚拟方法的虚拟实现。 – dcastro