FakeItEasy - 如何测试虚拟方法

FakeItEasy - how to test virtual method

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

When I debug the unit test step by step, noticed that it will not step into original method -->IsOrderHasToBeCharged(). Instead, it always default the returned value as False. Is it because the method is marked as virtual in the working class?

是的。这是完全正确的。当 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

但是,我不得不指出这可能不是这个特定测试的最佳方法。 一般来说,伪造被测系统是个坏主意,因为它会引起混乱,类似于您已经看到的情况。通常,应该使用隔离框架 ("faking frameworks") 来伪造被测系统与之协作的类型。然后在测试中实例化一个实际的被测系统并进行练习。

在这种情况下,ChargeProcessorSwitchHandler 没有协作者,所以我认为您最好替换

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

var switchHandler = new ChargeProcessorSwitchHandler();

那你就可以把 FakeItEasy 完全排除在测试之外了。