Cucumber.js 中的 World 对象或在 Cucumber 测试中放置状态的位置

rai*_*chu 7 javascript cucumberjs

我正在尝试在cucumber.js 中的一步(具有多个网站的平台上的页面)中保存当前导航状态,以便场景的以下步骤可以处理它。我想用 World 对象来做它,但神秘的事情正在发生。

我有一个像这样的导航状态对象:

module.exports = {
    pageName:null,
    siteName: null,
    isLoggedIn: false
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个这样的 NavigationStateManager

function NavigationStateManager() {
    var state
    this.setState = function(stateP) {
       state = stateP
    }
    this.setPage = function(pageNameP, siteNameP, isLoggedInP) {
        // among other things do something link this:
        state.pageName = pageNameP
        state.siteName = siteNameP
        state.isLoggedIn = isLoggedInP
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个 World 对象

var navState = require('./navigation-state')
var NavigationStateManager = require('./navigation-state-manager')

var navigationStateManager = new NavigationStateManager()

function World() {
    this.navState = simpleCopy(navState)
    navigationStateManager.setState(this.navState)
}

function simpleCopy(objectToCopy) {
    var copy = {}
    for(var key in objectToCopy) {
       copy[key] = objectToCopy[key]
    }
    return copy
}
Run Code Online (Sandbox Code Playgroud)

在我的步骤文件中,我这样做

var World = require('../support/world')

module.exports = function() {
   this.World = World

   this.Given(...)
   this.Then(...)
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,当执行了 Given 步骤并且正在执行 Then 步骤时, NavigationStateManager 中的状态变为未定义。当我登录时,我看不到使用“未定义”参数调用 setState。我有一个不同的设置,将 NavigationStateManager 放在 World 对象上,但它给了我类似的问题。显然 World 对象不会在场景的所有步骤中都保持不变,而是它的行为方式。该错误似乎与我拥有的所有 JavaScript 知识背道而驰。我在哪里把状态放在我的测试中?

rai*_*chu 5

导出函数的所有支持文件都将使用公开以下方法的上下文调用:

来源:https : //github.com/cucumber/cucumber-js/blob/master/docs/support_files/api_reference.md

我没有读过这个(可能也不会理解)。我还混淆了this对上下文对象的this引用和对世界对象的引用。

上下文是指在this您导出的函数中公开的对象。它是与 Cucumber API 交互的接口。

这个所谓的上下文对象不应该与世界对象混淆。world 对象是this您的步骤中的引用,由 Cucumber 根据您在上下文对象上设置的 World 构造函数(如果未设置则为默认值)为每个场景创建。

最后,您不应该像我一样要求并创建支持文件夹中导出的任何构造函数的新实例。由于 Cucumber 会自动调用这些构造函数,因此您最终会得到同一对象的两个实例。将您自己的辅助对象(如 PageObject)放在单独的文件夹中。