FakeItEasy - 如何测试虚拟方法

时间:2015-05-27 20:49:02

标签: unit-testing fakeiteasy

我正在使用FakeItEasy伪造类进行以下单元测试。 当我逐步调试单元测试时,注意到它不会进入原始方法 - > IsOrderHasToBeCharged()。相反,它始终将返回值默认为False。是因为该方法在工人阶级被标记为虚拟?有没有其他方法可以对该方法进行单元测试?

enter image description here

1 个答案:

答案 0 :(得分:6)

  

当我逐步调试单元测试时,注意到它不会进入   原始方法 - > IsOrderHasToBeCharged()。相反,它总是默认的   返回值为False。是因为该方法被标记为   在工人阶级虚拟?

是。这是完全正确的。当FakeItEasy创建伪造时,它会拦截对虚拟方法的所有调用,并提供自己的实现,如Overrideable members are faked所述。

如果您想要调用原始的IsOrderHasToBeCharged方法,可以将假配置为call the base method。这可以针对单个方法完成,如下所示:

A.CallTo(() => switchHandler.IsOrderHasToBeCharged(payCode, amount))
    .CallsBaseMethod();

或假冒时的每个方法,在创建时:

var switchHandler = A.Fake<ChargeProcessorSwitchHandler>(
     options => options.CallsBaseMethods());

其中任何一个都会导致调用原始IsOrderHasToBeCharged

然而,我不得不注意到这可能不是此特定测试的最佳方法。 一般来说,假装被测系统是一个坏主意,因为它可能引入混乱,类似于你已经看到的。通常,应使用隔离框架(&#34;伪造框架&#34;)伪造被测系统与之合作的类型。然后在测试中实例化一个实际的测试系统并进行操作。

在这种情况下,ChargeProcessorSwitchHandler没有合作者,所以我认为你最好更换

var switchHandler = A.Fake<ChargeProcessorSwitchHandler>();

var switchHandler = new ChargeProcessorSwitchHandler();

然后你可以完全退出FakeItEasy。