String.split () в функциональном файле каратэ, возвращающем исключения - PullRequest
0 голосов
/ 06 февраля 2019

Я не уверен, как можно отделить строку ответа от уже созданной функции, чтобы получить значение "Местоположение" заголовка ответа.

Что я пробовал

1)

Feature: Create Tariff

  Background:
  * def result = call read('../../get-user-token.feature')
  * def serviceId = call read('create-service.feature')

  Scenario: Create Tariff
    Given url 'https://app-dev.topbox.pro/tariff-svc/api/v1/tariffs'
    And header Authorization = result.response.token_type + " " + result.response.access_token
    And request
      """
      {
      serviceTypeId: '#(serviceId.responseHeaders['Location'].split('/')[1])',
      owner: 1,
      type: 0,
      pencePerMile: '69.69',
      minMileage: '1.00',
      minCost: 5,
      zoneFrom: '',
      zoneTo: '',
      fixedCost: 0
      }
      """
    When method POST
    Then status 201

Что привело к ...

IntegrationTests.TestSetup.create-тарифа: create-Тариф.функция: 10 - net.minidev.json.parser.ParseException: неожиданный токен L в позиции 46.

2)

Feature: Create Tariff

  Background:
  * def result = call read('../../get-user-token.feature')
  * def serviceId = call read('create-service.feature').responseHeaders['Location'].split('/')[1]

  Scenario: Create Tariff
    Given url 'https://app-dev.topbox.pro/tariff-svc/api/v1/tariffs'
    And header Authorization = result.response.token_type + " " + result.response.access_token
    And request
      """
      {
      serviceTypeId: '#(serviceId)',
      owner: 1,
      type: 0,
      pencePerMile: '69.69',
      minMileage: '1.00',
      minCost: 5,
      zoneFrom: '',
      zoneTo: '',
      fixedCost: 0
      }
      """
    When method POST
    Then status 201

, что привело к ...

сбойным функциям:IntegrationTests.TestSetup.create-Taris: -unknown-: 5 - сбой оценки JavaScript: чтение ('create-service.feature'). ResponseHeaders ['Location']. Split ('/') 1 ,TypeError: Невозможно прочитать свойство "Location" из неопределенного в строке номер 1

NOTE Указанная функция "create-service.feature" действительно работает, когда изолирована, и производитзаголовок ответа, как показано ниже

Location Header Response

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Я думаю, что первая ошибка связана с одинарными кавычками внутри вашего выражения, попробуйте экранировать, например,

,

And request
"""
{
serviceTypeId: '#(serviceId.responseHeaders.Location[0].split(\'/\')[1])',
owner: 1,
type: 0,
pencePerMile: '69.69',
minMileage: '1.00',
minCost: 5,
zoneFrom: '',
zoneTo: '',
fixedCost: 0
}
"""

Редактировать: только что было отмечено, что каждое значение в responseHeader имеет тип списказначение, чтобы получить к нему доступ, как Местоположение [0]

И ваш второй подход должен быть примерно таким,

* def serviceId = call read('create-service.feature').responseHeaders.Location[0].split('/')[1]
0 голосов
/ 06 февраля 2019

Используйте lastIndexOf вместо split:

* def location = responseHeaders['Location'][0]
* def serviceId = location.substring(location.lastIndexOf('/') + 1)
0 голосов
/ 06 февраля 2019

Вам необходимо использовать функцию Javascript: https://github.com/intuit/karate#javascript-functions

* def greeter = function(name){ return 'hello ' + name }
* assert greeter('Bob') == 'hello Bob'

РЕДАКТИРОВАТЬ:

* def service = { key : "someinfo/myServiceId"}
* def func = function(service){return service.key.split('/')[1]}
* def serviceId = func(service)
* match serviceId == "myServiceId"
...