【问题标题】:Unit testing a JSON formatter?对 JSON 格式化程序进行单元测试?
【发布时间】:2021-06-29 15:31:45
【问题描述】:

我正在构建一个库,它接收一个 JSON 字符串并根据用户选择的模板和规范对其进行格式化。

我最近开始为这个库编写单元测试,发现在某些情况下创建我可以断言的数据需要大量代码,并且在大多数情况下会使测试难以阅读。

作为包的作用的一个例子:

输入json:

{
   "id": 1,
   "name": "abc",
   "barId": 5
}

输出json:

{
   "href": "/foo/1",
   "name": "abc",
   "_children": [
      "bar": {
         "href": "/bar/5"
      }
   ]
}

因此,根据用户配置,解析后的 json 可能会被深度嵌套。

目前我已经构建了一个生成器,它使用 Newtonsoft.Json 来生成要断言的对象,但所有这些工作让我开始思考是否有更好的方法来做到这一点。

我需要做的一些测试例如:

  • 检查返回的 json 是否应该包含“_children”
  • 如果 href 为空、null 或根本不存在
  • 如果属性传递正确
  • 如果孩子的属性正确传递
  • 所有变化都基于配置。

那么,回到这个问题,是否有一些干净的方法来执行这种断言?除了手动构建之外,有没有更快的方法来构建预期的 json?

【问题讨论】:

    标签: c# json api xunit


    【解决方案1】:

    对我来说,您创建的不是“格式器”而是“JSON 生成器”,因为不仅仅是更改空格、制表符、括号等,而是从输入生成新内容。

    所有测试都是关于“对于这个输入,预期的输出是什么”

    因此,请创建足够的输入文件来涵盖所有规则/场景和相关的预期输出文件。

    然后,您可以选择任何 XUnit/Nunit。

    string input = loadJson("sample1.json") ;
    string expected = loadJson("sample1_expected.json") ;
    
    string generated = generateJson(input) ;
    
    if(compareJsonFiles(generated,expected)== 0)
        // files are equal
    else 
        // something went wrong
    

    我的代码非常通用,因为您的问题是概念性的,并且您没有提供任何代码。

    loadJson 可能涉及解析,这取决于您的生成器是如何实现的 - How can I parse JSON with C#?

    compareJsonFiles你可以查看这些答案 Find and return JSON differences using newtonsoft in C#?

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 2019-01-01
      • 2016-02-22
      • 2012-03-21
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      相关资源
      最近更新 更多