【发布时间】:2016-03-11 19:49:21
【问题描述】:
我需要对一个以异步方式加载数据的方法进行单元测试。 我可以通过
轻松运行异步测试方法[Test]
public async Task My_test_async() {
// ... await something
}
但我也希望 Setup 方法是异步的。因为它在 mocked Db 中准备了一些数据。这个模拟数据库当然也是异步的(它必须实现相同的接口)。
所以我的设置方法是这样的:
[Setup]
public async Task Setup() {
var db = new InMemoryDbContext();
// ... add sample data in db context
// ... then save them
await db.SaveChangesAsync();
}
我正在使用 NUnit 3.0.1 版、NUnitTestAdapter.WithFramework 2.0.0 版和带有 Resharper 9.2 的 VisualStudio 2015
可能的解决方法
我可以解决这个问题,但是这两种解决方案都不是很好。
解决方法 #1
将 Setup() 方法重构为私有,从中删除 [Setup] 属性,并在每个测试方法中调用它。这样就可以等待它并执行测试。
解决方法 #2
或者我可以使设置同步,并将异步代码包装在Task.Run().Result 中,像这样
var r = Task.Run(() => db.SaveChangesAsync()).Result;
但是这两种解决方法都很丑。
有人知道更好的解决方案吗?
【问题讨论】:
-
最好的办法是在 GitHub 上的 NUnit 问题跟踪器上打开一个问题。它应该可以工作,AFAIK
-
见this GitHub问题。
标签: c# visual-studio unit-testing asynchronous nunit