2017-02-14 3 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') 
}) 

それとも、より良いようなものを要素を選択したかったです

"helpers": { 
    "Nightmare": { 
    "url": "http://localhost:3000" 
    }, 
    "DOMElements": { 
    "require": "./__tests__/helpers/domelements_helper.js" 
    } 
} 
:私は次の持っている私の構成では http://codecept.io/helpers/

でガイドに記載されの

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})`) 
}) 
現在のヘルパーは、私はいくつかの特定のアクションを実行することはできません可能なので、私はカスタムハンドラを実装し始め

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 

このdoesnの'はっきりと働いている。これはちょっと混乱しています。

最初に、デフォルトのNode.jsアサーションライブラリを使用しています。必要がある場合は、プロトラクターやChai-as-promisedのようなより堅牢なものに移行しても構いませんが、 。

第二に、ドキュメントは明らかに次のように述べている:

任意のヘルパーメソッドが本当に意味がないチェーン

を約束するために追加されるために、値を返す必要があります...私は約束を返すべきですか、私はthen()の声明の中のすべてを扱うべきですか?基本的な価値を返すことは実際にはあまり効果がありません。それでも、失敗したアサーションをどうすれば処理できますか?

コードベースでナイトメアのクライアントスクリプトも見たことがありますが、私がちょっとだけコードベースを掘り下げ始めたので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()は約束を返します。設計上、これはかなり厄介なように見えますが、少なくとも現在の状態では実装が特に困難になっています。

関連する問題