如何从私有方法单元测试任务

时间:2014-06-01 11:29:27

标签: c# .net unit-testing moq

我有一个方法(删除了一些代码):

try
{
   var task = Task.Factory.StartNew(ValidateAccounts, _token);
}
catch (AggregateException)
{
   _tokenSource = new CancellationTokenSource();
   _token = _tokenSource.Token;
}

ValidateAccounts是一个具有相同类的私有方法。我想测试它是否被调用,并且希望能够模拟任务并尝试抛出异常并且没有它。

2 个答案:

答案 0 :(得分:2)

正如其他人所提到的那样,在进行什么样的测试与 -to-test测试的细线时,你必须要小心。它可能会导致与实现过于紧密相关的脆弱测试。

话虽这么说,我绝对看到你正在尝试做的事情。单独测试异常处理值得提出这个问题。

问题源于您使用静态对象(Task.Factory)。静态对象/方法因阻碍可测试性而臭名昭着。此问题的解决方案与用于解耦任何类型的静态对象的解决方案相同 - 引入了seam

您正在使用静态对象启动,并返回对Task的引用。您可以为此定义role interface。它可能看起来像:

public interface ITaskFactory
{
    Task StartNew(Action action);
}

使用如下的生产实现:

public class TplTaskFactory : ITaskFactory
{
    public Task StartNew(Action action)
    {
        return Task.Factory.StartNew(action);
    }
}

然后,您可以使用依赖注入为您的SUT提供此接口的模拟实现,从而为您提供所需的功能。

答案 1 :(得分:0)

单元测试不应该测试您的私有方法。您可以做的是将函数更改为protected并在单元测试类中扩展您的类。然后,您就可以直接从测试中调用它。此问题中的更多信息:Unit testing private methods in C#

此外,如果您要测试标记为async的功能,您也可以将async标记为您的测试功能,然后正常进行await通话。< / p>