【问题标题】:Unit test that checks Web API 2 Controller takes forever to Request.Content.ReadAsStringAsync()检查 Web API 2 控制器的单元测试永远需要 Request.Content.ReadAsStringAsync()
【发布时间】:2021-03-19 18:57:09
【问题描述】:

编辑:我添加了 async/await 关键字无济于事。

运行以下单元测试时,

private const string jsonRequest = @"
[
  {
    ""productId"": ""279"",
    ""price"": ""20.00"",
  }
]";

[TestMethod]
public async Task GivenAPostedJsonPayload_ThenCheckIfDataIsBeingSavedOnDatabase()
{
    var controller = new MyBelovedController();
    var message = new HttpRequestMessage();
    var content = new StringContent(jsonRequest);
    message.Content = content;
    message.Method = HttpMethod.Post;
    controller.Request = message;

    var response = await controller.PostIncrementalChange();
}

用下面的MyBelovedController,

[HttpPost]
public async Task<IHttpActionResult> PostIncrementalChange()
{
    string jsonRequest = await Request.Content.ReadAsStringAsync(); // Debugger gets stuck here.

    /* JSON deserialization and database processing take place here. */

    return Ok();
}

调试器卡在前面提到的行,并且需要永远进入下一行。

问题:有什么办法让它跑得更快?

规格:

  • 我的 Visual Studio 2019 Professional 构建版本是 16.8.5。
  • Microsoft .NET Framework 版本 4.8.04084。
  • Microsoft Windows 10 版本 2004 构建版本 19041.867。

编辑:我的笔记本电脑在调试解决方案时达到 100% 的 CPU 使用率,这可能是原因吗?

【问题讨论】:

    标签: c# unit-testing asp.net-web-api2 nunit


    【解决方案1】:

    尝试以这种方式使用异步模式。将您的方法标记为异步并返回Task。等待异步调用。删除.Result,使其无阻塞。

    [TestMethod]
    public async Task GivenAPostedJsonPayload_ThenCheckIfDataIsBeingSavedOnDatabase()
    {
        blah, blah, blah...
    
        var response = await controller.PostIncrementalChange();
    
        Assert.AreEqual(System.Net.HttpStatusCode.OK, response.StatusCode);
    }
    
    [HttpPost]
    public async Task PostIncrementalChange()
    {
        string jsonRequest = await Request.Content.ReadAsStringAsync();
    }
    

    【讨论】:

    • 嘿@Crowcoder,谢谢你的回复!如果我添加 async 并尝试使用 Postman 发布,您认为控制器会损坏吗?
    • 不,它不会损坏。
    • 我已经添加了async/await关键字,但无济于事。
    • 您尚未显示您的更新。您可以编辑您的问题。同样重要的是什么是“等”。您省略的代码。死锁可能发生在调用堆栈的深处,因此您必须“一直使用”异步。
    • 问题的更新如上所示。 etc. 已被删除。我解释说那里有一个 JSON 反序列化和处理步骤。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    相关资源
    最近更新 更多