You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MsTest测试问题:Controller返回Json时StatusCode始终为空

解决JsonResult状态码无法断言的问题

问题核心是:Json()方法返回的JsonResult实例默认不会自动设置StatusCode,而OkObjectResult本身就携带200状态码。针对这个问题,有两种可行的解决思路:

1. 修改控制器代码,明确返回带状态码的结果

如果业务允许,可以直接调整返回结果的类型,或手动为JsonResult指定状态码:

方案1a:用Ok()返回JSON格式内容

控制器的GetJson方法可以直接返回OkObjectResult,ASP.NET Core会自动将对象序列化为JSON格式:

[HttpGet("json")]
public async Task<IActionResult> GetJson()
{
    return await Task.FromResult(Ok(new { Message = "Success" }));
}

这种方式下,测试代码可以和TestOkResult保持一致,直接断言OkObjectResult的状态码为200。

方案1b:手动给JsonResult设置状态码

如果必须保留JsonResult,可以在返回时显式指定状态码:

[HttpGet("json")]
public async Task<IActionResult> GetJson()
{
    var jsonResult = Json(new { Message = "Success" });
    jsonResult.StatusCode = StatusCodes.Status200OK;
    return await Task.FromResult(jsonResult);
}

修改后测试时就能正常获取到200的状态码。

2. 改进测试方法,模拟ApiController的自动状态码行为

你的控制器标注了[ApiController]特性,ASP.NET Core运行时会自动为未设置状态码的JsonResult填充200状态码,但直接实例化控制器时不会触发这个逻辑。可以通过以下方式模拟这一行为:

方案2a:在测试中设置ControllerContext

[TestMethod]
public void TestJsonResult()
{
    var services = new ServiceCollection();
    services.AddScoped<ExampleController>();
    var controller = services.BuildServiceProvider().GetRequiredService<ExampleController>();
    // 设置空的ControllerContext,触发ApiController的状态码自动填充逻辑
    controller.ControllerContext = new ControllerContext();
    
    var result = controller.GetJson().Result;
    var parsedResult = result as JsonResult;
    Assert.IsInstanceOfType<JsonResult>(result);
    // 此时StatusCode会被ApiController特性自动设置为200
    Assert.AreEqual(200, parsedResult?.StatusCode ?? 500);
}

方案2b:使用WebApplicationFactory进行集成测试

如果需要更贴近真实运行环境的测试,可以采用集成测试方式:

[TestClass]
public class ExampleControllerIntegrationTests
{
    private readonly HttpClient _client;

    public ExampleControllerIntegrationTests()
    {
        var factory = new WebApplicationFactory<Program>();
        _client = factory.CreateClient();
    }

    [TestMethod]
    public async Task TestJsonResult_Integration()
    {
        var response = await _client.GetAsync("/Example/json");
        response.EnsureSuccessStatusCode(); // 断言状态码为200
        var content = await response.Content.ReadFromJsonAsync<dynamic>();
        Assert.AreEqual("Success", content.Message);
    }
}

这种方式会完整模拟请求流程,自动触发[ApiController]的所有内置行为。

内容的提问来源于stack exchange,提问作者Vinicius Andrade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:23:18