如何对传递给另一个方法的Action进行单元测试?

本文关键字:Action 单元测试 方法 另一个 | 更新日期: 2023-09-27 18:05:01

我正在尝试单元测试一个方法,其中有一行

_pollingService.StartPolling(1000, PollingHit)

其中PollingHit是调用类的私有方法,StartPolling的签名是

public void StartPolling(double interval, Action action)

现在不管PollingHit()里面是什么,我怎么测试它?因为调用这个方法的责任是在PollingService上,但是因为它不是一个被测试的类,所以我不应该创建它的具体对象。

如何对传递给另一个方法的Action进行单元测试?

根据该类的期望行为,通过包含_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(); 
    }    
}