我有一个方法(删除了一些代码):
try
{
var task = Task.Factory.StartNew(ValidateAccounts, _token);
}
catch (AggregateException)
{
_tokenSource = new CancellationTokenSource();
_token = _tokenSource.Token;
}
ValidateAccounts
是一个具有相同类的私有方法。我想测试它是否被调用,并且希望能够模拟任务并尝试抛出异常并且没有它。
答案 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>