我希望使用this article中的提示来推动我的项目的代码覆盖率接近100%。具体来说,最后一节概述了我无法控制或无法注入的方法的解决方法。文章中给出的非通用Task
版本就像一个魅力,但我在使用通用Task<T>
版本时遇到了一些麻烦。
我可能只是错过了一些明显的东西。
我的awaiter(为简洁而删除了调试标志)是:
public class EnsureCodeCoverageAwaiter<T> : INotifyCompletion
{
private readonly TaskAwaiter<T> taskAwaiter;
private bool forceAsync;
public EnsureCodeCoverageAwaiter(Task<T> task)
{
this.taskAwaiter = task.GetAwaiter();
this.forceAsync = true;
}
public bool IsCompleted
{
get
{
if (this.forceAsync)
return false;
return this.taskAwaiter.IsCompleted;
}
}
public T GetResult()
{
this.forceAsync = false;
return this.taskAwaiter.GetResult();
}
public void OnCompleted(Action continuation)
{
this.forceAsync = false;
this.taskAwaiter.OnCompleted(continuation);
}
}
我的等待是:
public class EnsureCodeCoverageAwaitable<T>
{
private Task<T> _task;
public EnsureCodeCoverageAwaitable(Task<T> task)
{
_task = task;
}
public EnsureCodeCoverageAwaiter<T> GetAwaiter<T>()
{
return new EnsureCodeCoverageAwaiter<T>(_task);
}
}
根据编译器的说法,问题出现在GetAwaiter<T>
方法的最后一行。编译器告诉我:
EnsureCodeCoverageAwaiter的最佳重载方法匹配(任务&lt; T&gt;)有一些无效的参数
如果我使用Visual Studio的工具来生成构造函数存根&#34;从同一行开始,它在EnsureCodeCoverageAwaiter
中生成第二个构造函数,其签名与现有构造函数完全相同,并且错误仍然存在。 (我可以继续使用相同的工具来生成越来越多相同的构造函数存根。)
当我在构建该行代码时查看intellisense时,构造函数表示它期望Task<T>
并且传递它的变量声称它是Task<T>
类型。
我在这里想念一些关于仿制药的东西吗?
答案 0 :(得分:7)
这是问题所在:
public EnsureCodeCoverageAwaiter<T> GetAwaiter<T>()
您不希望它是引入新类型参数T
的泛型方法 - 您只想使用该类型的type参数。所以你想要:
public EnsureCodeCoverageAwaiter<T> GetAwaiter()
编译器应该给你一个警告:
CS0693:类型参数
中的类型参数同名'T'
与外部类型'EnsureCoverageAwaitable<T>'
始终检查编译器警告:)