web-dev-qa-db-fra.com

Comment utiliser Jasmine et CucumberJS avec rapporteur

Je cherche à utiliser Protractor, CucumberJS et Jasmine pour tester mon projet. Comment utiliser Jasmine et CucumberJS avec Protractor? Voici la configuration du projet que j'ai créée:

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

Comme vous pouvez le constater, ce projet utilise "concombre" comme cadre. Comment puis-je ajouter dans le cadre Jasmine à côté de CucumberJS? S'agirait-il du fichier de configuration de Protractor ou d'un autre endroit dans le code?

/ chemin/vers/monproj / fonctionnalités/demo.feature

Feature: Some terse yet descriptive text of what is desired

  Scenario: Some determinable business situation
    Given some precondition

/ path/to/myproj / features/stepDefinitions.js

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

Lorsque ceci est exécuté, "expect" n'est pas défini, probablement parce que Jasmine n'a pas été intégré et qu'il est global avec lui. Voici le message d'erreur complet:

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

/ chemin/vers/monproj / 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"
  }
}

Remarque: J'utilise un commit particulier dans le référentiel Protractor Git dans mon package.json, car la dernière version (2.1.0) contient un bogue , qui empêche l'intégration avec CucumberJS.

13

CucumberJS et Jasmine s’excluent mutuellement; vous ne pourrez pas utiliser les attentes de Jasmine dans les étapes Cucumber. Ce que vous devez faire à la place est de charger un module d’attente séparé. Je suggérerais Chai avec le plugin chai-as-promise . (chai-as-promise simplifie le processus de rédaction des attentes autour des promesses. Protractor annule la fonction expect() dans Jasmine et le fait pour vous dans les coulisses) Il est probable que vous souhaitiez le faire dans votre monde, car c'est le moyen le plus simple de fournir accès à celui-ci dans vos définitions d'étape. Votre monde ressemblerait à quelque chose comme ça:

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;

Ensuite, dans votre fichier de définitions d'étape, vous chargez simplement dans le monde conformément à la documentation de CucumberJS et vos définitions d'étape seront étendues pour permettre l'accès à toutes les propriétés du monde:

module.exports = function() {

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

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

Maintenant, pour une auto-promotion éhontée: si vous utilisez Protractor avec CucumberJS, je vous recommanderais de regarder un module que j'ai aidé à construire appelé CukeFarm . Il est préconfiguré avec quelques modules qui vous seront utiles et il fournit un certain nombre de définitions d’étapes générales pouvant être utilisées dans la plupart des projets.

23
Nathan Thompson
0
Manoj