对 JSON 格式化程序进行单元测试?

Unit testing a JSON formatter?

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

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

作为包的作用的例子:

输入json:

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

输出json:

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

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

现在我已经构建了一个使用 Newtonsoft.Json 生成 objects 断言的生成器,但所有这些工作让我思考是否有更好的方法来做到这一点.

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

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

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

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

因此,创建足够的输入文件来涵盖所有 rules/scenarios 和相关的预期输出文件。

然后随心所欲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#?