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



我已经开始玩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"
}
}

并且CCD_ 2当前看起来如下:

'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,但越瘦越好。

第二,文件明确规定如下:

任何辅助方法都应该返回一个值,以便添加到承诺链

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

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

任何指针都非常感谢

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

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()返回一个promise,所有的事情都必须异步处理,尽管在设计上这似乎很尴尬,而且它使事情特别难以实现,至少在当前状态下是这样。

最新更新