如何对传递给另一个方法的Action进行单元测试?
本文关键字:Action 单元测试 方法 另一个 | 更新日期: 2023-09-27 18:05:01
我正在尝试单元测试一个方法,其中有一行
_pollingService.StartPolling(1000, PollingHit)
其中PollingHit是调用类的私有方法,StartPolling的签名是
public void StartPolling(double interval, Action action)
现在不管PollingHit()里面是什么,我怎么测试它?因为调用这个方法的责任是在PollingService上,但是因为它不是一个被测试的类,所以我不应该创建它的具体对象。
根据该类的期望行为,通过包含_pollingService
的类的公共方法测试它。你可以通过检查轮询服务是否调用了传递的动作来测试它本身,这个动作是什么并不重要。
当你测试轮询服务时,你应该只测试当你开始轮询时,它在给定的间隔内调用给定的动作。轮询服务对PollingHit
方法一无所知(因为它在不同的类中)。为了测试这一点,您可以通过pollingservice
实现一个计数器的测试方法,并检查计数器是否如您所期望的那样递增。您可以(并且应该)在没有 PollingHit
方法的情况下测试这个。
当你来测试使用pollingService
的类的行为时,你想测试它的行为,不管它是如何实现的。它使用轮询服务调用PollingHit
方法的事实是一个无关的实现细节,重要的是由PollingHit
方法封装的行为在需要时被调用。
想象一下,如果有人提出了一种基于"推"的方式来做你目前正在做的事情,通过轮询(这是一个"拉"模型),并实现了pushNotificationService
。使用轮询服务的类的行为应该保持不变,即使在您重构它以删除pollingService
并用新的pushNotificationService
替换它之后。如果您只测试行为,那么在您进行了此重构更改之后,您的测试将不需要更改。
如果您已经在使用模拟PollingService
,那么您可以放弃它,使用自己的test double,并使用它来控制自己的调用。像这样:
public class TestPollingService : IPollingService
{
Action theAction;
public void StartPolling(double interval, Action action)
{
theAction = action;
}
public void TestInvocation()
{
theAction();
}
}