cucumber.js 中的世界对象或在黄瓜测试中放置状态的位置

World object in cucumber.js or where to put state in cucumber tests

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

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

module.exports = {
    pageName:null,
    siteName: null,
    isLoggedIn: false
}

然后我有一个像这样的 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
    }
}

我有一个 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
}

我在步骤文件中这样做

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

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

   this.Given(...)
   this.Then(...)
}

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

All support files that export a function will be called with a context that exposes the following methods:

source: 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)放在单独的文件夹中。