首页 > 解决方案 > 是否可以在 afterScenario 块中使用嵌入式表达式?

问题描述

我在功能文件中有多个场景。在每个场景结束时,我需要在下一个场景开始之前“清理”。我的清理函数需要传入一个 json 对象。每个场景都有不同的对象。因此,我需要使用嵌入式表达式,这样动态数据就会被删除。

我的设置是这样的:

        * configure afterScenario = 
        """
        function(){
          var deleteData = { customerData: '#(portfolio)' };
          karate.call(deleteData.feature@deletePortfolio', deleteData);
        }

场景可能如下所示:

        // here we get a brand new, unused "portfolio" value from a related function.
        * table customer1
            |portfolio  | status |
            |portfolio  | 200    |
        * call read(random.feature@random) customer1

因此,在上述场景结束时,我希望 afterScenario 启动并删除该场景的“投资组合”变量值。但是,因为它是 afterScenario 块内的 Java 互操作,所以它不能识别空手道的嵌入表达式。有什么办法吗?

标签: karate

解决方案


当您在 JS 块中时,您就“脱离”了空手道。所以嵌入式表达式不起作用,但“JS 风格”表达式起作用。

阅读一遍以更清楚地了解这一点:https ://github.com/karatelabs/karate#karate-expressions

所以这将起作用:

* configure afterScenario = 
    """
    function(){
      var deleteData = { customerData: portfolio };
      karate.call('deleteData.feature@deletePortfolio', deleteData);
    }

甚至:

* configure afterScenario = function(){ karate.call('deleteData.feature@deletePortfolio', { customerData: portfolio }) }

还有一个提示,karate.get('someVariableName')可以随时为您获取任何变量的值。

而且我确实认为您过度设计了您的测试,请不要:

https://stackoverflow.com/a/46080568/143475

https://stackoverflow.com/a/60944060/143475

https://stackoverflow.com/a/54126724/143475


推荐阅读