Можно ли отправить аргументы в функцию AfterScenario?

#karate

#каратэ

Вопрос:

Я видел в документе, что можно определить функцию в фоновой части и выполнять ее после каждого сценария. смотрите: https://github.com/intuit/karate/blob/master/karate-demo/src/test/java/demo/hooks/hooks .особенность

Но мне нужно отправить аргументы в эту функцию и не нахожу никаких решений…

В документе:

 * configure afterScenario = 
"""
function(){
  var info = karate.info; 
  karate.log('after', info.scenarioType   ':', info.scenarioName);
  karate.call('after-scenario.feature', { caller: info.featureFileName });
}
"""
  

Что я хотел бы сделать:

utils/js/afterFunc.js:

 function fn(args){
  karate.log('after', args.msg);
}
  

MyTest.feature:

 * configure afterScenario = read('classpath:utils/js/afterFunc.js') {msg: 'Hello !'}
  

Ответ №1:

read Функция прочитает afterFunc.js файл, но игнорирует {msg: 'Hello !'} параметр.

Скрипты могут вызывать другие скрипты, но вы не хотите вызывать скрипт немедленно, не так ли? Вы хотите создать ссылку на функцию и назначить эту ссылку afterScenario конфигурации.

Но этого недостаточно. Вы хотите выполнить каррирование функции — что такое каррирование?

AFAIK это не поддерживается read напрямую.

Существует обходной путь. Вы можете прочитать файл javascript и создать функцию, которая вызывает ваш after-scenario-function параметр по вашему выбору.

   Background:
    * def fn = read('classpath:after-scenario-with-params.js')
    * configure afterScenario =
    """
      function() {
        fn(karate.info, 'hello world');
      }
    """
  

after-scenario-with-params.js Содержит следующую функцию js:

 function fn(info, someParameter) {
    karate.log('called after scenario:', info.scenarioName);
    karate.log('some parameter: '   someParameter);
}
  

Вот и все.

Я передал полный запущенный пример в свой репозиторий karate sandbox. Репозиторий основан на gradle и groovy. Надеюсь, это поможет.

Комментарии:

1. Это работает отлично, спасибо за ваш ответ! К вашему сведению, именование функции важно, потому что, если вы вызываете другой файл .js в одном из сценариев с функцией, также названной «fn», этот обходной путь больше не работает…