2017-02-14 9 views
0

Ich habe angefangen, mit CodeceptJs herumzuspielen, und ich habe es funktioniert ziemlich leicht. Ich benutze es gerade mit NightmareJs und alles scheint in Ordnung zu sein.Umgang mit Behauptungen in einem benutzerdefinierten Helfer

Der spezifische Bereich, den ich testen möchte, ist eine Galerie, die Daten von einer Schnittstelle über JSONP abruft und eine Liste von Bildern erstellt, die in <div> s verpackt sind.

Ein Teil der Tests ist, dass ich die Umsetzung wie folgt aus:

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') 
}) 

Nun, da die Elemente beliebig viele sein können, ist es zur Zeit still um das erste Element verwendet wird, sondern um es zu geben, ein bisschen mehr Entropie ich wollte ein Element zufällig, so etwas wie die folgenden

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') 
}) 

Oder noch besser holen, wenn ich die Liste der Elemente greifen könnte, damit ich, was man zu klicken Sie auf, wie entscheiden kann:

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})`) 
}) 

Die aktuellen Helfer mir nicht erlauben, zur Verfügung haben einige bestimmte Aktionen auszuführen, so begann ich einen benutzerdefinierten Handler Implementierung wie bei http://codecept.io/helpers/

In meiner Konfiguration Ich habe folgendes in der Anleitung beschrieben:

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

und domelements_helper.js sieht derzeit wie folgt aus:

'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 

Dieses doesn 't - klar - arbeiten. Dies ist, wo ich ein bisschen verwirrt bin.

Als Erstes benutze ich die Standard-Node.js-Assertion-Bibliothek, und wenn es nötig ist, bin ich glücklich, zu etwas Robusterem wie dem Protractor oder Chai-wie versprochen zu wechseln, aber je schlanker desto besser .

Zweitens ist die Dokumentation eindeutig besagt Folgendes:

jeder Hilfsmethode Wert hinzugefügt, um zurückkehren sollte Kette

versprechen, die nicht wirklich Sinn macht ... sollte ich ein Versprechen zurückgeben oder sollte ich die ganze Sache innerhalb der then() Anweisung behandeln? Die Rückgabe eines Basiswertes ist nicht wirklich viel. Wie gehe ich selbst dann mit fehlgeschlagenen Assertions um?

Ich habe auch ein Nightmare-Clientskript in der Codebasis gesehen, aber ich habe keine Ahnung, ob es für meinen Fall von Nutzen ist, da ich grade durch die Codebasis gegraben habe, um ein bisschen besser zu verstehen um CodeceptJs anzupassen und zu erweitern.

Alle Hinweise sind wirklich zu schätzen

Antwort

1

da niemand scheint so weit gekommen zu sein, werde ich eine Antwort hinzufügen, wie ich gefunden zu haben scheinen, wie dieses Ding, indem Sie durch die Code-Basis arbeitet und verstehen, ein bisschen mehr wie es funktioniert.

tl; dr: die schnelle Lösung ist folgende:

/* __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 

Die Art und Weise funktioniert das Ganze durch Versprechungen, und Sie haben Scheitern angemessen zu behandeln, so dass das gesamte System ordnungsgemäß fehlschlagen kann (sorta).

Insbesondere _locate() gibt ein Versprechen zurück und alles muss asynchron gehandhabt werden, obwohl dies vom Design her ziemlich umständlich erscheint und es die Dinge besonders schwierig macht, zumindest im aktuellen Zustand zu implementieren.

Verwandte Themen