KarateDSL не может сохранить мой токен аутентификации на руде, чем один запрос - PullRequest
0 голосов
/ 05 сентября 2018

Исходя из моего предыдущего вопроса здесь

Действительно пытаюсь разобраться со всей документацией, и я действительно изо всех сил пытаюсь разобраться в нескольких концепциях. В основном, я не понимаю, как работает настройка заголовков. Короче говоря, я делаю почтовый запрос, чтобы войти и получить токен авторизации. Когда я получаю токен авторизации, я также хочу получить все куки, и тогда могут начаться другие мои тесты. Я думаю, что я действительно борюсь с идеей использования примера headers.js. Я пытался и не получил, где.

мой каратэ-конфиг:

function() {
karate.configure('connectTimeout', 5000);
karate.configure('readTimeout', 5000);
karate.configure('ssl', true);
karate.configure('logPrettyRequest', true);
karate.configure('logPrettyResponse', true);

var env = karate.env; // get system property 'karate.env'
karate.log('karate.env system property was:', env);

if (!env) {
   env = 'dev';
   }

var config = {
    env: env,
    baseUrl: 'https://someurl'
    }

if (env == 'dev') {
    // cust
} else if (env == 'e2e') {
    // customize
}

return config;
}

Моя функция аутентификации (которая находится рядом с karate-config.js). Должны ли сеанс и токен ниже быть доступными в моих сценариях?

Feature: Log in user and authenticate

Background:
* url baseUrl

Scenario: Login user

Given path '/api.fs/ProfileLogin'
And request {"request":{"LoginName":"user","Password":"password"}}
When method POST
Then status 200
And match response.IsSuccess == true
* def r = response
* def session = {"OrganizationCode":'#(r.Session.OrganizationCode)',"OrganizationId":'#(r.Session.OrganizationId)',"SessionId":"","UserId":'#(r.UserId)',"Environment":'#(r.Session.Environment)'}
* def token = r.Token

Следующее - мой первый правильный тест, который после вышеупомянутой аутентификации должен сделать 2 запроса.

Feature: Do some application stuff

Background:
* url baseUrl
* def signIn = call read('classpath:authenticate.feature')
* header Authorization = signIn.Token 

Scenario: Get an application's data and edit

# get all user's applications
Given path '/ListApplications'
And request {"request":{},"Session":'#(signIn.session)'}
When method POST
Then status 200
And def applicationId = response.Applications[0].Id

#get first application in list
Given path '/GetApplication'
And request {"request":{"ApplicationId":'#(applicationId)'},"Session":'#(signIn.session)'}
When method POST
Then status 200

Первый запрос в порядке, но второй запрос не включает authToken, поэтому он терпит неудачу. почему токен аутентификации не сохраняется? Я попытался переместить '* header Authorization = signIn.Token' в authenticate.feature, но это просто означало, что первый запрос не содержал заголовок Authorization.

Я чувствую, что перепробовал все возможности в учебнике, где / как после запуска authenticate.feature я получаю токен и затем автоматически назначаю его всем будущим запросам, будь то в том же или другом сценарии

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

вместо * header Authorization = signIn.token,

, который только устанавливает заголовок для следующего вызова, вы должны использовать

* configure headers = { Authorization: '#(signIn.token)' },

, который устанавливает заголовок для всех последующих вызовов в сценарии.

0 голосов
/ 05 сентября 2018

Да, насколько я могу судить, signIn.session должно работать. Действительно не в состоянии понять отсюда.

Можете ли вы попытаться заставить все работать в одном сценарии для начала.

Нет, подождите, я думаю, что простая опечатка может быть проблемой. t ниже должен быть в нижнем регистре, потому что это то, что вы def указали в authenticate.feature

* header Authorization = signIn.token
...