使用 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
我有一个方法 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);