无法匹配具有嵌套数组的文件中的架构

时间:2018-12-30 16:40:38

标签: karate

假设我有一个回应-杰森(Json)如下图

def resJson =
  """
      {
         "id": 1,
         "code": "OU82883",
         "features":
           [
                {
                    "id": 12,
                    "class": "OU8811",
                    "school": "parent",
                    "course": "abc",
                    "sortOrder": 123
                }
           ]
      }
   """

为了易于管理文件进行比较,我将预期的模式-预期的结果放置在文件(“ getCourseDetails.txt”)中,结构如下:

{
    id: '#number',
    code: '#string',
    features: ##[{
           id: '#number',
           class: '##string',
           school: '##string',
           course: '##string',
           sortOrder: '#number'
      }
    ]

}

然后在已执行的功能文件中,将代码执行为

* json expSchema= read ('../Data/Schema/getCourseDetails.txt')
* match resJson == expSchema

系统通知AssertionFailed错误

要找到另一种验证模式的方法,我仅将结构保留在“ getCourseDetails”的“功能”内部。在“功能”之外,我放入了执行的功能文件。所以我的代码现在是:

GetCourseDetails文件

 {
     id: '#number',
     class: '##string',
     school: '##string',
     course: '##string',
     sortOrder: '#number'

 }

功能文件:

* json courseDetails= read ('../Data/Schema/getCourseDetails.txt')
* def expSchema = {id: '#number', code: '#string', features: '##[] courseDetails'}
* match resJson == expSchema

没有错误并且验证效果很好,但是这种方法并不是我所期望的。

我想知道是否有一种方法可以将文件中的所有内容集中化,而用户只需调用文件以根据实际响应的模式进行验证

非常感谢您。

1 个答案:

答案 0 :(得分:1)

我认为您过度设计了测试,但是您可以使用JS进行高级设置,并以所需的方式构建模式,并且该模式可以重复使用。例如:

first.json

{ "foo": "#string" } 

second.json

{ "value": "#number" }

schema.js

function() {  
  var first = read('first.json');
  karate.set('second', read('second.json'));
  first.bar = '##[] second';
  return first;
}

现在您的功能文件可以是:

* def schema = call read('schema.js')
* def response = { foo: 'test', bar: [{value: 1}, {value: 2}] }
* match response == schema

以上,如果您* print schema,您将看到:

{
  "foo": "#string",
  "bar": "##[] second"
}

如果您想要单线-* match response == call read('schema.js')应该可以工作!