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

How do I unit test an Action Passed to another method

我正在尝试对具有一行的方法进行单元测试

_pollingService.StartPolling(1000, PollingHit)

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

public void StartPolling(double interval, Action action)

现在无论 PollingHit() 中有什么,我该如何测试它?由于调用此方法的责任在 PollingService 上,但由于它不是 class 正在测试的,所以我不应该创建它的具体对象。

通过 class 的 public 方法对其进行测试,其中包含 _pollingService 基于 class 的所需行为。您可以通过检查它是否调用传递的操作来测试轮询服务本身,该操作是什么并不重要。

当您测试轮询服务时,您应该只测试当您开始轮询时它会在给定的时间间隔调用给定的操作。轮询服务对 PollingHit 方法一无所知(因为它在不同的 class 中)。要对此进行测试,您可以传递 pollingservice 一个实现计数器的测试方法,并检查计数器是否如您预期的那样递增。您可以(并且应该)在没有 PollingHit 方法的情况下测试此

当您测试使用 pollingService 的 class 的行为时,您想要测试其行为,而不管它是如何实现的。它使用轮询服务调用PollingHit方法是无关紧要的实现细节,重要的是调用了PollingHit方法封装的behaviour当你需要的时候。

想象一下,如果有人想出一个基于 'push' 的方法来做你目前正在做的事情,通过轮询(这是一个 'pull' 模型)并实现一个 pushNotificationService。使用轮询服务的 class 的 行为 应该保持不变,即使您重构它以删除 pollingService 并将其替换为新的 [=18] =].如果您只测试行为,那么在您进行此重构更改后,您的测试将不需要更改。

如果您已经在使用模拟 PollingService 那么您可能可以放弃它并使用您自己的测试替身并使用它来自己控制调用。像这样:

public class TestPollingService : IPollingService 
{ 
    Action theAction; 
    public void StartPolling(double interval, Action action) 
    { 
        theAction = action; 
    } 

    public void TestInvocation() 
    { 
        theAction(); 
    }    
}