Проблема с использованием маркера #regex - PullRequest
2 голосов
/ 08 июня 2019

У меня проблемы с созданием правильного маркера #regex.

Я пытаюсь сопоставить пару форматов даты в своем ответе. JSON:

"created": "2017-03-23T14:16:25.854Z" "modified": "2018-06-21T05:38:37.978Z"

Я пробовал следующие маркеры:

'#regex [0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z' '#regex [0-9]{4}-[0-9]{2}-[0-9]{2}.[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}.' '#regex \d+-\d+-\d+.\d+:\d+:\d+.\d+.'

Все 3 формы кажутся правильными (согласно rubular.com). Я также играл с избегающими персонажами, которые могут быть проблематичными. До сих пор я был в состоянии получить всю работу:

[0-9-T:.Z]+

Но это выглядит немного "плохо" из сопоставления с образцом.

В основном я пытаюсь это:

* def meta = { created: '#regex[[0-9]{4}-[0-9]{2}-[0-9]{2}.[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}.]', modified: '#regex[[0-9]{4}-[0-9]{2}-[0-9]{2}.[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}.]' } And match each response == """ { id: '#regex [a-z0-9]+', name: '#string', type: '<Type>', meta: #(meta), integration_id: '#uuid' } """

Получите ошибку, подобную этой:

KarateException: objects-api.feature:40 - path: $[0].meta.created, actual: '2016-11-30T20:48:16.782Z', expected: '#regex [0-9]+-[0-9]+-[0-9]+[0-9]+:[0-9]+:[0-9]+[0-9]+', reason: regex match failed

1 Ответ

1 голос
/ 08 июня 2019

Вот предложение, почему бы вам не проанализировать даты в java Date объектах, и это откроет больше возможностей, например, возможность сравнить 2 даты.

Вот хорошие примеры: https://stackoverflow.com/a/54133126/143475 https://stackoverflow.com/a/55938480/143475

Тем не менее, я думаю, что вы упустили необходимость избежать обратной косой черты, это Java-вещь и упоминается в документации. Так что это работает:

* def date = '2017-03-23T14:16:25.854Z'
* match date == '#regex \\d+-\\d+-\\d+.\\d+:\\d+:\\d+.\\d+.'
* match date == '#regex [0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z'

Движок Karate JS также поддерживает объект RegExp JS, поэтому посмотрите, дает ли этот пример и некоторые решения:

https://stackoverflow.com/a/54768838/143475

РЕДАКТИРОВАТЬ, это работает и для меня:

* def meta = { created: '#regex \\d+-\\d+-\\d+.\\d+:\\d+:\\d+.\\d+.', modified: '#regex \\d+-\\d+-\\d+.\\d+:\\d+:\\d+.\\d+.' }
* def response = [{ meta: { created: '2017-03-23T14:16:25.854Z', modified: '2018-06-21T05:38:37.978Z' } }]
* match each response == { meta: '#(meta)' }
...