【发布时间】:2015-08-12 21:51:47
【问题描述】:
我是 async/await 领域的新手,我正在尝试找出为异步方法编写异步单元测试的好处。也就是说,必须对异步方法进行单元测试以异步调用该异步方法吗?如果它使用Task.Run()同步调用异步方法,会丢失什么?在后一种情况下,就我所见,代码覆盖率没有受到影响。
我问这个的原因是因为我们的模拟软件(我们使用 TypeMock)不能支持 async/await。 (They say there is a legitimate reason 缺乏支持,我并不反对他们。)通过在单元测试中同步调用异步方法,我们可以解决这个问题。不过,我想知道我们这样做是否是在偷工减料。
例如,假设我有以下异步方法:
public async Task<string> GetContentAsync(string source)
{
string result = "";
// perform magical async IO bound work here to populate result
return result;
}
以下是不起作用的理想单元测试:
[TestMethod()]
public async Task GetContentAsyncTest()
{
string expected = "thisworks";
var worker = new Worker();
// ...mocking code here that doesn't work!
string actual = await worker.GetContentAsync();
Assert.AreEqual(expected, actual);
}
但这有效,并且确实提供了我们需要的代码覆盖率。这样可以吗?
[TestMethod()]
public void GetContentAsyncTest()
{
string expected = "thisworks";
var worker = new Worker();
// mocking code here that works!
string actual = Task.Run(() => worker.GetContentAsync()).Result;
Assert.AreEqual(expected, actual);
}
【问题讨论】:
-
我不太喜欢这个问题;标题有点宽泛。在大多数情况下,您不是在测试某件事是否花费了 X 长或 Y 长,您只是在说“如果它完成了,请确保这发生了”或“如果它失败了,请确保这发生了”。在绝大多数情况下,是否是异步都不会发挥作用。
-
异步处理主要是为了释放线程池或者IIS工作进程
-
@George Stocker 我知道,但我看到异步单元测试示例的事实让我认为人们编写它们是有原因的。那你对标题有什么建议?你不能在投反对票之前给我一个改进它的机会吗?有点触发快乐?
-
还有TypeMock的原因不好。
-
@Zoomzoom 嗯...不是真的。异步就像毒药,我们只是将堆栈中的所有内容都设为异步:p
标签: c# unit-testing asynchronous async-await typemock-isolator