首页 > 解决方案 > 是否可以将 args 发送到 afterScenario 函数?

问题描述

我在文档中看到可以在后台部分定义一个函数并在每个场景之后执行它。见:https ://github.com/intuit/karate/blob/master/karate-demo/src/test/java/demo/hooks/hooks.feature

但我需要将 args 发送到这个函数并且没有找到任何解决方案......

在文档中:

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

我想做什么:

实用程序/js/afterFunc.js:

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

我的测试功能:

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

标签: karate

解决方案


read函数将读取afterFunc.js文件,但它忽略{msg: 'Hello !'}参数。

脚本可以调用其他脚本,但您不想立即调用该脚本,是吗?您想要创建一个函数引用并将该引用分配给afterScenario配置。

但这还不够。你想对函数进行柯里化——什么是柯里化?

AFAIK 这不是read直接支持的。

有一种解决方法。after-scenario-function您可以阅读 javascript 文件并创建一个使用您选择的参数调用您的函数。

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

包含以下after-scenario-with-params.jsjs函数:

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

而已。

我向我的空手道沙箱存储库提交了一个完整的运行示例。该 repo 是基于 gradle 和 groovy 的。我希望它有所帮助。


推荐阅读