处理自定义帮助程序中的断言

时间:2017-02-14 13:39:06

标签: javascript nightmare codeceptjs

我开始玩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-promise那样更强大的东西,但越小越好。

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

  

任何帮助方法都应返回一个值,以便添加到promise链

哪个没有意义......我应该回复一个承诺,还是应该在then()声明中处理整个事情?返回一个基本值并没有真正做多少。即便如此,我如何处理失败的断言?

我也在代码库中看过一个梦魇客户端,但我不知道它是否对我的情况有用,因为我刚开始挖掘代码库以便更好地理解如何自定义和扩展CodeceptJs。

非常感谢任何指针

1 个答案:

答案 0 :(得分: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

整个过程的工作方式是承诺,你必须妥善处理失败,以便整个系统可以优雅地失败(sorta)。

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