You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在NUnit中断言JSON结果与预期结果一致?

在NUnit中断言ASP.NET接口返回的JSON结果与预期一致的方法

我来帮你梳理下怎么在NUnit里完成这个断言,结合你给出的接口和测试代码来看:

首先先把你的接口代码放出来方便参考:

public ActionResult AddMakeAliasData(MakeAliasModel makeAliasModel) { 
    if (!ModelState.IsValid) { 
        ModelState.LogModelStateError(); 
        throw new BusinessException("COMMON_ERROR"); 
    } 
    var response = _vehicleDataBusinessService.AddMakeAliasData(makeAliasModel); 
    return Json(response); 
}

接下来是完善你的测试用例,核心步骤是获取JsonResult的返回数据,再和预期值做对比,具体实现如下:

[Test] 
public void ShouldReturnJsonInAddMakeAlias() { 
    // Arrange
    // 1. 构造预期的返回数据
    var expectedResponse = new GetVehicleDataAliases { 
        ErrorMessage = null, 
        // 填充其他你需要验证的属性值
        SomeOtherProperty = "test-value"
    };

    // 2. Mock业务服务,让它返回我们构造的预期数据
    var mockService = new Mock<IVehicleDataBusinessService>();
    mockService.Setup(s => s.AddMakeAliasData(It.IsAny<MakeAliasModel>()))
               .Returns(expectedResponse);

    // 3. 实例化控制器,注入mock服务
    var controller = new YourControllerName(mockService.Object); // 替换成你的控制器实际类名

    // Act
    var actionResult = controller.AddMakeAliasData(new MakeAliasModel());
    var jsonResult = actionResult as JsonResult;

    // Assert
    // 第一步:确认返回的是有效的JsonResult
    Assert.NotNull(jsonResult, "接口未返回JsonResult类型的结果");
    
    // 第二步:将JsonResult的Data转换为目标模型类型
    var returnedResponse = jsonResult.Data as GetVehicleDataAliases;
    Assert.NotNull(returnedResponse, "返回的JSON数据无法转换为GetVehicleDataAliases类型");

    // 第三步:对比返回数据和预期数据
    // 方式1:逐个属性断言(适合需要精确验证特定属性的场景)
    Assert.AreEqual(expectedResponse.ErrorMessage, returnedResponse.ErrorMessage);
    Assert.AreEqual(expectedResponse.SomeOtherProperty, returnedResponse.SomeOtherProperty);
    // 继续添加其他需要验证的属性断言

    // 方式2:深比较整个对象(前提是你的模型类重写了Equals和GetHashCode,或者是C# 9+的record类型)
    Assert.AreEqual(expectedResponse, returnedResponse);

    // 方式3:用NUnit的约束做自定义深比较(无需重写Equals)
    Assert.That(returnedResponse, Is.EqualTo(expectedResponse).Using<GetVehicleDataAliases>((x, y) => 
        x.ErrorMessage == y.ErrorMessage 
        && x.SomeOtherProperty == y.SomeOtherProperty
        // 添加其他属性的对比逻辑
    ));
}

额外提个小技巧:如果你的项目允许引入第三方库,FluentAssertions会让断言代码更简洁直观,比如:

returnedResponse.Should().BeEquivalentTo(expectedResponse);

它会自动进行深比较,无需手动写每个属性的断言。

总结一下核心流程:

  • 先mock业务服务,确保它返回你预设的预期数据
  • 调用控制器方法后,把返回结果转换成JsonResult
  • 验证转换后的结果有效,再提取里面的Data转换为目标模型
  • 选择适合的断言方式对比返回数据和预期数据

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

火山引擎 最新活动