【问题标题】:Testing JSON string response with Nunit使用 Nunit 测试 JSON 字符串响应
【发布时间】:2019-11-14 13:19:57
【问题描述】:

我有一个返回 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);

        }

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

我是新手,希望得到任何帮助 - 我已经查看了其他问题/答案,但似乎仍然无法弄清楚。

【问题讨论】:

  • 您可以使用第三方库来转换为 json,例如 Newtonsoft :)
  • 在我的测试中? @Hackerman

标签: .net json unit-testing nunit


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    这似乎是XY problem

    控制器操作应返回适当的强类型响应

    例如

    [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
    }
    

    框架请求管道将根据请求序列化并返回响应。

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

    [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,应进行实际发出 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      相关资源
      最近更新 更多