javascript - 使用 Yadda 和 Protractor 重用步骤定义,迭代所需的文件

标签 javascript protractor bdd yadda

我是 JavaScript 新手,最近开始使用 Protractor 和 Yadda 编写自动化测试,以便可以使用 Gherkin。但是我刚刚发现步骤定义似乎不可重用,即如果我运行该功能

testMyWebAppRocks.feature

它将使用定义的步骤

testMyWebAppRocks.steps.js

但是,该功能文件中可能有几个相同的步骤,例如

    Given I am on the homepage

它将出现在另一个功能文件中,例如

testThisParticularPartOfMyWebAppRocks.feature

并且要求在与该功能相对应的步骤定义中重写步骤。显然,这并不理想,不适合 DRY,而且对于相当复杂的单页 Web 应用程序,许多功能可能需要相同的步骤。

那么,有没有办法将所有步骤定义加载到库中并针对该库运行功能?做这种事情时的最佳实践是什么?

显然,我不想将所有场景都塞进一个难以管理的功能文件中,步骤定义也是如此。我也不想一直重复相同的代码。

更新

好的,所以我找到了解决这个问题的方法,将我的库连接在一起

var library = englishLibrary.library();
var firstSteps = require('./steps/first-steps')(library);
var secondSteps = require('./steps/second-steps')(firstSteps);
var yadda = Yadda.createInstance(secondSteps);

我现在的问题是,这很快就会变得非常难看,是否可以循环执行此操作?如果我可以使用 glob,那么我就不需要知道实际的步骤定义名称,但我真的不太了解 JavaScript,不知道从哪里开始。

谢谢。

最佳答案

没有什么特殊原因不能。

就 JS 而言,您基本上可以在任何地方传递任何值,这包括将内容传递给 require 调用。

这是否是一个“好的”结构完全是另一个问题。

注意到您实际传递给 given when 等方法调用的是函数可能会对您有所帮助 - 如果您发现自己一遍又一遍地传递相同的函数,为什么不将函数定义分解到 ./lib/common_test_functions 库中呢?

而不是:

Yadda.localisation.English.library()
.given('I am on the homepage', function() {
    // Code goes here
});

也许:

var testUtils = require('./lib/common_test_functions.js')
Yadda.localisation.English.library()
.given('I am on the homepage',testUtils.verifyHomePage)

没有什么规定你必须将匿名函数作为回调传递 - 你可以在任何你想要的地方定义函数,并在需要时传递它们。

你甚至可以这样做:

function myGivenWrapper(yaddaInstance,testText,testFunction){
    yaddaTestLib.given(testText,testFunction)
}
var yadda = Yadda.localisation.English.library()
myGivenWrapper(yadda,testUtils.homepage.givenText,testUtils.homepage.test)

JS 为您提供了强大的表达能力,可以根据您的需要随意进行函数调用 - 如果某人的库似乎没有以对您的用例有意义的方式构建事物,您可以随时编写包装函数并实现“更好”的接口(interface)。

关于javascript - 使用 Yadda 和 Protractor 重用步骤定义,迭代所需的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37254652/

相关文章:

javascript - 在 Protractor 中捕获 “angular could not be found on the window”

javascript - 如何将 jsdom.jQueryify 与 Jasmine Node 一起使用?

resharper - 如何安装 MSpec BDD 框架?

javascript - 各种JS模板;为什么两个{?

javascript - 使用删除按钮而不是 Html.ActionLink 来调用 Controller 的操作?

angularjs - 期望两个元素相等

javascript - 无法使用 protractor.js 从弹出窗口的下拉菜单中单击并选择一个值

ruby-on-rails-3 - 如何使用 rspec + capybara 重用不同功能中的场景

javascript - JSON 字符串在 post 请求期间发生更改

javascript - 用于抓取的服务器端脚本语言的替代方案