【问题标题】:Handling assertions in a custom helper在自定义助手中处理断言
【发布时间】:2017-07-02 19:58:04
【问题描述】:

我已经开始使用 CodeceptJs,而且我已经很容易地让它工作起来。我目前正在将它与 NightmareJs 一起使用,一切似乎都很好。

我正在测试的特定区域是一个画廊,它通过 JSONP 从接口获取数据,创建一个包含在<div>s 中的图像列表。

我正在实施的部分测试如下:

Feature('gallery')
Scenario('clicking on an element adds "selected" class', (I) => {
  I.amOnPage('/')
  I.seeElement('#gallery .col-md-3')
  I.click('#gallery .col-md-3')
  I.seeElement('#gallery .selected')
})

现在由于元素可以是任意数字,它目前默默地使用第一个元素,但为了给它更多的熵,我想随机选择一个元素,如下所示

Scenario('clicking on an element adds "selected" class', (I) => {
  I.amOnPage('/')
  I.seeMoreThanElements('#gallery .col-md-3', 1)
  I.clickOnRandomElement('#gallery .col-md-3')
  I.seeElement('#gallery .selected')
})

或者更好的是,如果我可以获取元素列表,以便我可以决定点击哪一个,例如:

Scenario('clicking on an element adds "selected" class', (I) => {
  I.amOnPage('/')
  I.seeMoreThanElements('#gallery .col-md-3', 1)
  const elements = I.grabRandomElement('#gallery .col-md-3')
  const random = getRandomInt(1, elements.length)
  I.click(`#gallery .col-md-3:nth-child(${random})`)
  I.seeElement(`#gallery .col-md-3.selected:nth-child(${random})`)
})

当前可用的帮助器不允许我执行某些特定操作,因此我开始按照http://codecept.io/helpers/ 指南中的描述实现自定义处理程序

在我的配置中,我有以下内容:

"helpers": {
  "Nightmare": {
    "url": "http://localhost:3000"
  },
  "DOMElements": {
    "require": "./__tests__/helpers/domelements_helper.js"
  }
}

domelements_helper.js 目前如下所示:

'use strict'
let assert = require('assert')

class DOMElements extends Helper {
  seeMoreThanElements (locator, count) {
    this.helpers['Nightmare']._locate(locator).then(function (els) {
      return assert(els.length >= count, `Found more than ${count} elements`)
    })
  }
}

module.exports = DOMElements

这显然不起作用。这就是我有点困惑的地方。

首先,我使用的是默认的 Node.js 断言库,如果有任何需要,我很乐意使用更强大的东西,比如 Protractor 或 Chai-as-promised,但越精简越好。

其次,文档清楚地说明了以下内容:

任何辅助方法都应该返回一个值才能被添加到承诺链中

这真的没有意义......我应该返回一个承诺还是应该在then() 语句中处理整个事情?因为返回一个基本值并没有多大作用。即使这样,我该如何处理失败的断言?

我还在代码库中看到了 Nightmare 客户端脚本,但我不知道它是否对我的情况有用,因为我刚刚开始深入研究代码库以便更好地了解如何自定义和扩展 CodeceptJs。

任何指针都非常感谢

【问题讨论】:

    标签: javascript nightmare codeceptjs


    【解决方案1】:

    由于似乎没有人走到这一步,我将添加一个答案,因为我似乎已经通过代码库找到了这个东西的工作原理并更多地了解它是如何工作的。

    tl;dr: 快速解决方案如下:

    /* __tests__/helpers/domelements_helper.js */
    const assert = require('assert')
    
    class DOMElements extends Helper {
    
      seeMoreThanElements (locator, count) {
        return this.helpers['Nightmare']._locate(locator)
          .then((elementsArray) => {
            if (elementsArray.length < count) {
              return assert.fail(elementsArray.length, count, `Found more than ${count} elements`)
            }
          })
      }
    }
    
    module.exports = DOMElements
    

    整个事情的工作方式是通过承诺,你必须适当地处理失败,以便整个系统可以优雅地失败(排序)。

    特别是 _locate() 返回一个承诺,所有事情都必须异步处理,尽管从设计上看这似乎很尴尬,而且它使事情特别难以实现,至少在当前状态下是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 2015-05-29
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 2019-12-25
      相关资源
      最近更新 更多