我有以下四个测试,运行时最后一个挂起。为什么会这样:
[Test]
public void CheckOnceResultTest()
{
Assert.IsTrue(CheckStatus().Result);
}
[Test]
public async void CheckOnceAwaitTest()
{
Assert.IsTrue(await CheckStatus());
}
[Test]
public async void CheckStatusTwiceAwaitTest()
{
Assert.IsTrue(await CheckStatus());
Assert.IsTrue(await CheckStatus());
}
[Test]
public async void CheckStatusTwiceResultTest()
{
Assert.IsTrue(CheckStatus().Result); // This hangs
Assert.IsTrue(await CheckStatus());
}
private async Task<bool> CheckStatus()
{
var restClient = new RestClient(@"https://api.test.nordnet.se/next/1");
Task<IRestResponse<DummyServiceStatus>> restResponse = restClient.ExecuteTaskAsync<DummyServiceStatus>(new RestRequest(Method.GET));
IRestResponse<DummyServiceStatus> response = await restResponse;
return response.Data.SystemRunning;
}
我将这种扩展方法用于restsharp RestClient:
public static class RestClientExt
{
public static Task<IRestResponse<T>> ExecuteTaskAsync<T>(this RestClient client, IRestRequest request) where T : new()
{
var tcs = new TaskCompletionSource<IRestResponse<T>>();
RestRequestAsyncHandle asyncHandle = client.ExecuteAsync<T>(request, tcs.SetResult);
return tcs.Task;
}
}
public class DummyServiceStatus
{
public string Message { get; set; }
public bool ValidVersion { get; set; }
public bool SystemRunning { get; set; }
public bool SkipPhrase { get; set; }
public long Timestamp { get; set; }
}
为什么最后一个测试挂起?
7
您应该避免从异步方法返回void。它仅是为了与现有事件处理程序(主要是接口代码)向后兼容。如果您的异步方法未返回任何内容,则应返回Task。我在MSTest上遇到了很多问题,并且返回异步测试无效。
—
ghord 2013年
@ghord:MSTest根本不支持
—
Stephen Cleary 2013年
async void
单元测试方法。他们根本行不通。但是,NUnit可以。就是说,我同意优先async Task
于的一般原则async void
。
@StephenCleary是的,尽管它在VS2012的beta中被允许,这引起了各种各样的问题。
—
ghord 2013年