Je ne sais pas comment je peux séparer la chaîne de réponse d'une fonctionnalité déjà créée pour obtenir la valeur de l'en-tête de réponse "Location".
Ce que j'ai essayé
1)
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
Ce qui a abouti à ...
IntegrationTests.TestSetup.create-tarif: create-fee.feature: 10 - net.minidev.json.parser.ParseException: jeton L inattendu à la position 46.
2)
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
Ce qui a abouti à ...
fonctionnalités ayant échoué: IntegrationTests.TestSetup.create-tarif: -unknown-: 5 - Échec de l'évaluation JavaScript: read ('create-service.feature'). responseHeaders ['Location']. split ('/') 1 , TypeError: impossible de lire la propriété "Location" depuis undefined dans à ligne numéro 1
REMARQUE La fonctionnalité spécifiée "create-service.feature" fonctionne effectivement lorsqu'elle est isolée et produit l'en-tête de réponse, comme indiqué ci-dessous
p >
3 Réponses :
Vous devez utiliser une fonction Javascript: https://github.com/intuit/karate # javascript-functions
* def service = { key : "someinfo/myServiceId"} * def func = function(service){return service.key.split('/')[1]} * def serviceId = func(service) * match serviceId == "myServiceId"
MODIFIER:
* def greeter = function(name){ return 'hello ' + name } * assert greeter('Bob') == 'hello Bob'
malheureusement, cela ne semble pas fonctionner non plus. eval> à la ligne numéro 1 "
Ensuite, le problème doit être avec service.responseHeaders ['Location'], et non avec le fractionnement. J'ai modifié ma réponse avec un appel de travail à split ().
Je pense que la première erreur est due à des guillemets simples dans votre expression, essayez d'échapper à cela
comme,
* def serviceId = call read('create-service.feature').responseHeaders.Location[0].split('/')[1]
Edit: Je viens de noter chaque valeur dans responseHeader a une valeur de type liste alors accédez-y comme Emplacement [0]
Et votre deuxième approche devrait être quelque chose comme ça,
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 } """
malheureusement, la réponse côté serveur a pris cela comme une chaîne littérale '"detail": {"Property": "serviceTypeId", "Message": "Invalid guid format", "Value": "# (serviceId.responseHeaders.Location [0] .spl it ('/') [1]) "}} 'plutôt que la valeur réelle de l'en-tête de réponse d'emplacement
Utilisez lastIndexOf
au lieu de split
:
* def location = responseHeaders['Location'][0] * def serviceId = location.substring(location.lastIndexOf('/') + 1)