使用 Nunit 测试 JSON 字符串响应

Testing JSON string response with Nunit

我有一个方法 returns 一个 JSON 字符串(我暂时在值中进行了硬编码)。我正在尝试对此进行单元测试,但正在努力找出如何最好地做到这一点。

    [HttpGet, Route("GetData")]
    public ActionResult<string> GetData()
    {
        var person = new Person();
        person.Name = "Ben";
        person.Age = 30;

        string json = JsonConvert.SerializeObject(person, Formatting.Indented);
        Console.WriteLine(json);
        return json; 
    }

到目前为止,我已经尝试了以下方法(开始于):

  [Test]
        public void GetData_ApiCallMade_ReturnsJsonString()
        {
            var controller = new Controller();
            JsonResult result = controller.GetData() as JsonResult;

        }

(此错误因为它无法将字符串转换为 JsonResult

我可以通过以下测试:

 [Test]
        public void GetData_ApiCallMade_ReturnsJsonString()
        {
            var controller= new Controller();
            var result = controller.GetData();
            Assert.IsNotNull(result);

        }

然而,这似乎并没有真正测试任何实质性的东西。

我是新手,如果有任何帮助,我将不胜感激 - 我已经查看了其他 questions/answers,但似乎仍然无法弄明白。

在将包含对象的字符串响应序列化为 JSON 后,您可以使用相同的库将对象反序列化为相同的 class.

var result = controller.GetData();
var person = JsonConvert.DeserializeObject<Person>(result.Value);

现在您可以测试从您的控制器获取的对象是否有效。只需断言其属性与其预期值相等即可。

Assert.AreEqual(person.Name, "Bob");
Assert.AreEqual(person.Age, 30);

这似乎是 XY problem

控制器操作应该return适当的强类型响应

例如

[HttpGet("GetData")]
public ActionResult<Person> GetData() {
    var person = new Person() {
        Name = "Ben",
        Age = 30
    };

    //...other logic may return an error result.

    return person; //Return action result
}

框架请求管道将根据请求进行序列化和return响应。

它可以很容易地进行单元测试

[Test]
public void GetData_ApiCallMade_Returns_Person() {
    //Arrange
    var controller = new Controller();
    //...also set expectations

    //Act
    var result = controller.GetData();

    //Assert
    Assert.IsNotNull(result);
    Person person = result.Value as Person;
    //...other assertions.

}

引用Test controller logic in ASP.NET Core

为了查看预期的 JSON 在实际调用时被 returned,那么应该进行实际发出 HTTP 请求的集成测试。

//Arrange
//...code removed for brevity

//Act
HttpResponseMessage response = await client.GetAsync(url);

//Assert
response.EnsureSuccessStatusCode(); // Status Code 200-299
string json = await response.Content.ReadAsStringAsync();
var person = JsonConvert.DeserializeObject<Person>(json);
Assert.AreEqual(person.Name, "Bob");
Assert.AreEqual(person.Age, 30);

参考Integration tests in ASP.NET Core