7 c# unit-testing async-await asp.net-web-api owin
我正在HttpClient尝试在Web API控制器中执行POST方法.控制器方法是同步的.我是这样做的:
var response = owin.HttpClient.PostAsJsonAsync(uri, body);
Run Code Online (Sandbox Code Playgroud)
之后我打电话给Wait:
var result = response.Wait(15000);
Run Code Online (Sandbox Code Playgroud)
运行此代码时,我看到http结束执行,但result值始终为false.我能错过什么?
编辑:我现在尝试了异步方法,但它也没有帮助我
public IHttpActionResult Add(Item item)
{
var result = _db.AddItem(item);
return Ok(result);
}
Run Code Online (Sandbox Code Playgroud)
测试项目:
TestServer _owinTestServer;
public async Task<HttpResponse message> Method1(string url, object body)
{
return await
_owinTestServer.HttpClient.PostAsJsonAsync(url,body);
}
public async Task<ItemPreview> Method2(object body);
{
return await Method1("..", body ).Result.Content.ReadAsAsync<ItemPreview>();
}
[TestMethod]
public void test1()
{
Item item = new(...);
Method2(item).Continue with(task => {// Never reach here }
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?在调试时,我看到控制器方法返回了一个很好的响应,但它永远不会回到我的测试
你是混合异步和阻塞调用(即.Result,.Wait()),这是导致死锁.
这看起来更像是测试客户端的阻塞问题.
如果要等待服务器的结果,则需要在此情况下始终使测试异步.
将测试方法转换为异步
[TestMethod]
public async Task test1() {
//Arrange
Item item = new Item(...);
//Act
var preview = await Method2(item);
//Assert
Assert.IsNotNull(preview);
}
Run Code Online (Sandbox Code Playgroud)
并更新方法不混合异步和阻塞调用.
Method1asyn/await如果它在调用之后没有使用任务就不需要它可以被移除并且只需要返回Task可以等待的方法
TestServer _owinTestServer;
public Task<HttpResponse> Method1(string url, object body) {
return _owinTestServer.HttpClient.PostAsJsonAsync(url, body);
}
Run Code Online (Sandbox Code Playgroud)
Method2需要await响应Method1然后获取其内容.
public async Task<ItemPreview> Method2(object body) {
var response = await Method1("..", body );
return await response.Content.ReadAsAsync<ItemPreview>();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
673 次 |
| 最近记录: |