2015-06-09 3 views
13

Ich suche Winkelmesser, CucumberJS und Jasmine für das Testen meines Projektes. Wie benutze ich Jasmine und CucumberJS mit Protractor? Hier ist das Projekt-Setup die ich angelegt habe:Wie man Jasmine und CucumberJS mit Winkelmesser benutzt

/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' 
    } 
}; 

Wie Sie sehen können, dieses Projekt verwendet "Gurke" als Rahmen. Wie füge ich das Jasmine-Framework neben CucumberJS hinzu? Würde dies durch die Winkelmesser-Konfigurationsdatei oder irgendwo anders im Code geschehen?

/path/to/myproj/Funktionen/demo.feature

Feature: Some terse yet descriptive text of what is desired 

    Scenario: Some determinable business situation 
    Given some precondition 

/path/to/myproj/Funktionen/stepDefinitions.js

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

Wenn dies ausgeführt wird "Expect" ist nicht definiert, vermutlich weil Jasmine nicht integriert wurde und es global erwartet wird. Hier ist die vollständige Fehlermeldung:

$ $(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" 
    } 
} 

Hinweis: Ich verwende eine insbesondere auf den Protractor Git-Repository in meinem Paket zu begehen. json, weil die neueste Version (2.1.0) a bug hat, die die Integration mit CucumberJS verhindert.

Antwort

23

CucumberJS und Jasmine schließen sich gegenseitig aus; Sie werden nicht in der Lage sein, Jasmines Erwartungen in Gurkenschritten zu verwenden. Was Sie stattdessen tun müssen, ist ein separates Erwartungsmodul zu laden. Ich würde vorschlagen, Chai mit dem chai-as-promised Plugin. (Chai-as-Versprochen vereinfacht den Prozess des Schreibens von Erwartungen um Versprechen. Winkelmesser hebt die expect() Funktion in Jasmine auf, um dies für Sie hinter den Kulissen zu tun) Wahrscheinlich werden Sie dies in Ihrer Welt tun wollen, da dies der einfachste Weg ist Zugriff darauf in Ihren Step-Definitionen. Ihre Welt würde wie folgt aussehen:

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; 

Dann in Ihrem Schritt Definitionen Datei, die Sie laden nur in der Welt pro den CucumberJS documentation und Sie sind Schritt Definitionen scoped werden um Zugang zu allen Eigenschaften der Welt:

Jetzt
module.exports = function() { 

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

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

, für einige schamlose Eigenwerbung: wenn Sie Protractor mit CucumberJS verwenden, würde ich empfehlen, bei einem Modul der Suche half ich CukeFarm genannt bauen. Es ist vorkonfiguriert mit ein paar Modulen, die Sie nützlich finden und es bietet eine Reihe von allgemeinen Step-Definitionen, die für die meisten Projekte verwendet werden können.

+0

Mokka ein Test-Framework, die für die Verwendung eines Erwartungs Modul ermöglicht, einschließlich Chai. Ist das einer der Gründe, warum Mocha als Einheitentestframework populär ist, so dass das gleiche Erwartungsmodul, das für das Schreiben von Gurkentests verwendet wird, auch für Komponententests verwendet werden kann, was für einen konsistenteren Code im Testcode sorgt?Danke für deine Antwort und für die CukeFarm Empfehlung! –

+0

@AristarkhArtemiy yep, das ist ein sehr guter Grund für Mocha. Es ist eine gute Sache, die gleichen Muster/Syntax (mit Chai zum Beispiel) in deinen Unit-Tests und Cucumber-Step-Definitionen zu verwenden, besonders wenn andere Leute in die Codebasis springen müssen. – jbpros

+0

Können Sie die Gründe erklären, warum sich CucumberJS und Jasmine gegenseitig ausschließen? Ich versuche, CucumberJs in Winkelmesser zu integrieren, um E2E-Tests auszuführen. Wenn ich das trainieren könnte, wäre das so schön. Stack verwende ich: Angular2, Webpack, .. –

Verwandte Themen