Я рекомендую разбить ваш матч на 2 шага, чтобы избежать чрезмерного усложнения:
* def response = [{ a: 1, b: null, c: 2 }, { a: 2, b: [x, y, z], c: 3 }]
* match each response contains { b: '#present' }
* match each response == { a: '#number', b: '##array', c: '#number' }
Вы можете объединить ссылку «маркер» и «себя» - см. Последний пример здесь: https://github.com/intuit/karate#self-validation-expressions
* match each response == { a: '#number', b: '##array? _ != null', c: '#number' }
Для полноты вот еще один вариант. Обратите внимание, что функция isValid()
может использоваться повторно и должна быть определена (глобально) только один раз.
* def isValid = function(x){ return !x || karate.match(x, '#array').pass }
* match each response == { a: '#number', b: '#? isValid(_)', c: '#number' }