2017-02-14 34 views
0

我已经开始使用CodeceptJs,并且我已经很容易地开展工作。我目前正在与NightmareJs一起使用它,一切似乎都很好。在定制帮手中处理断言

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

我执行的测试的部分是这样的:

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()声明中处理整个事情?由于返回一个基本的价值并没有太大的作用。即使如此,我如何处理失败的断言?

我也在代码库中看到过一个恶梦客户端,但我不知道它是否对我的情况有任何用处,因为我刚开始深入了解代码库以便更好地理解定制和扩展CodeceptJs。

任何指针非常感谢

回答

1

,因为似乎没有人到目前为止已经有这个,我要添加一个答案,我似乎找到了这件事情是如何工作的通过代码库去,了解多一点怎么运行的。

TL;博士:快速的解决方案是:整个事情的工作原理是通过承诺

/* __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()返回一个承诺,所有东西都必须异步处理,虽然从设计上来说这似乎很笨拙,并且使事情变得特别困难,至少在当前状态下。