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