2015-06-09 11 views
13

Sto cercando di utilizzare Goniometro, CucumberJS e Jasmine per testare il mio progetto. Come uso sia il gelsomino che il cetriolo con il goniometro? Ecco la messa a punto del progetto che ho creato:Come utilizzare Jasmine e CucumberJS con il goniometro

/path/to/MyProj/protractor.conf.js

exports.config = { 
    seleniumServerJar: 'node_modules/protractor/selenium/selenium-server-standalone-2.45.0.jar', 

    specs: [ 
    'features/*.feature' 
    ], 

    baseUrl: 'http://localhost:8080', 

    multiCapabilities: [ 
    { 
     'browserName': 'chrome' 
    } 
    ], 

    allScriptsTimeout: 380000, 
    getPageTimeout: 20000, 

    framework: 'cucumber', 

    cucumberOpts: { 
    require: 'features/stepDefinitions.js', 
    format: 'summary' 
    } 
}; 

Come si può vedere, questo progetto utilizza "cetriolo", come il quadro. Come aggiungo il framework Jasmine a CucumberJS? Lo farebbe attraverso il file di configurazione del goniometro o qualche altro nel codice?

/path/to/myproj/caratteristiche/demo.feature

Feature: Some terse yet descriptive text of what is desired 

    Scenario: Some determinable business situation 
    Given some precondition 

/path/to/myproj/caratteristiche/stepDefinitions.js

module.exports = function() { 
    this.Given(/^some precondition$/, function (callback) { 
    expect(true).toEqual(true); 
    callback(); 
    }); 
}; 

Quando questo viene eseguito "Aspettarsi" non è definito, presumibilmente perché Jasmine non è stato integrato, e si aspetta che sia globale insieme ad esso. Ecco il messaggio di errore completo:

$ $(npm bin)/protractor protractor.conf.js 
Starting selenium standalone server... 
[launcher] Running 1 instances of WebDriver 
Selenium standalone server started at http://192.168.1.115:59957/wd/hub 
(::) failed steps (::) 

ReferenceError: expect is not defined 
    at World.<anonymous> (/path/to/myproj/features/stepDefinitions.js:3:5) 
    at process._tickCallback (node.js:355:11) 


Failing scenarios: 
/path/to/myproj/features/demo.feature:3 # Scenario: Some determinable business situation 

1 scenario (1 failed) 
1 step (1 failed) 
Shutting down selenium standalone server. 
[launcher] 0 instance(s) of WebDriver still running 
[launcher] chrome #1 failed 1 test(s) 
[launcher] overall: 1 failed spec(s) 
[launcher] Process exited with error code 1 

/path/to/myproj/package.json

{ 
    "name": "myproj", 
    "version": "1.0.0", 
    "description": "", 
    "main": "index.js", 
    "scripts": { 
    "test": "echo \"Error: no test specified\" && exit 1" 
    }, 
    "author": "", 
    "license": "ISC", 
    "devDependencies": { 
    "cucumber": "0.4.9", 
    "protractor": "git+https://github.com/angular/protractor.git#0262268fa43b9eefac815d986740efa07bb15818" 
    } 
} 

Nota: sto usando una particolare commit al repository Git goniometro nel mio pacchetto. json, perché l'ultima versione (2.1.0) ha a bug, che impedisce l'integrazione con CucumberJS.

risposta

23

CucumberJS e Jasmine si escludono a vicenda; non sarai in grado di usare le aspettative di Jasmine nei passi di Cetriolo. Quello che devi fare invece è caricare un modulo di aspettazione separato. Vorrei suggerire Chai con il plugin chai-as-promised. (chai-as-promised semplifica il processo di scrittura delle aspettative intorno alle promesse.Il goniometro ha la funzione di expect() in Jasmine per fare questo per te dietro le quinte) Molto probabilmente vorrai farlo nel tuo mondo in quanto è il modo più semplice per fornire accedi ad esso nelle tue Definizioni Step. Il tuo mondo sarebbe simile a questa:

var World, chai, chaiAsPromised; 
chai = require('chai'); 
chaiAsPromised = require('chai-as-promised'); 

World = function World(callback) { 
    chai.use(chaiAsPromised); 
    this.expect = chai.expect; 
    callback(); 
} 

module.exports.World = World; 

Poi nelle definizioni Passo file appena caricato nel Mondo per il CucumberJS documentation e sei definizioni passo sarà scope per fornire l'accesso a tutte le proprietà del mondo:

module.exports = function() { 

    this.World = require("path/to/world.js").World; 

    this.Given(/^some precondition$/, function (callback) { 
    this.expect(true).to.equal(true); 
    callback(); 
    }); 
}; 

Ora, per un po 'sfacciata auto-promozione: se si sta utilizzando goniometro con CucumberJS, mi sento di raccomandare guardando un modulo I aiutato a costruire chiamato CukeFarm. Viene fornito preconfigurato con alcuni moduli che troverai utili e fornisce una serie di definizioni generali che possono essere utilizzate nella maggior parte dei progetti.

+0

Mocha è un framework di testing, che consente l'utilizzo di qualsiasi modulo aspettativa, compreso Chai. Questo è uno dei motivi per cui Mocha è popolare come framework di testing unitario, in modo che lo stesso modulo di aspettative utilizzato per scrivere i test di Cucumber possa essere utilizzato anche per scrivere test di unità, creando un codice più coerente basato sul codice di test?Grazie per la risposta e per la raccomandazione CukeFarm! –

+0

@AristarkhArtemiy sì, questo è un ottimo motivo per andare per Mocha. Usare gli stessi pattern/sintassi (con chai per esempio) nei test di unità e nelle definizioni di passi di Cucumber è una buona cosa, specialmente se altre persone devono saltare nella base di codice. – jbpros

+0

puoi approfondire i motivi per cui CucumberJS e Jasmine si escludono a vicenda? Sto cercando di integrare CucumberJs nel goniometro per eseguire i test E2E. Se potessi fare quel lavoro sarebbe bello. Stack Sto usando: Angular2, webpack, .. –

Problemi correlati