2015-06-09 2 views
13

Я ищу использовать Транспортир, CucumberJS и Жасмин для тестирования моего проекта. Как использовать Jasmine и CucumberJS с помощью Protractor? Вот проект установки я создал:Как использовать Jasmine и CucumberJS с транспортиром

/путь/к/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' 
    } 
}; 

Как вы можете видеть, этот проект использует "огурец" в качестве основы. Как добавить в систему Jasmine вместе с CucumberJS? Будет ли это через конфигурационный файл Protractor или где-нибудь еще в коде?

/путь/к/MYPROJ/функции/demo.feature

Feature: Some terse yet descriptive text of what is desired 

    Scenario: Some determinable business situation 
    Given some precondition 

/путь/к/MYPROJ/функции/stepDefinitions.js

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

Когда это выполнено , «ожидание» не определено, по-видимому, потому, что Жасмин не был интегрирован, и он ожидает глобального вместе с ним. Вот сообщение полной ошибки:

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

/путь/к/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" 
    } 
} 

Примечание: Я использую конкретную фиксацию в хранилище транспортира Git в моем пакете. json, потому что последняя версия (2.1.0) имеет a bug, что предотвращает интеграцию с CucumberJS.

ответ

23

CucumberJS и жасмин взаимоисключающие; вы не сможете использовать ожидания Жасмина в шагах Огурца. Вместо этого вам нужно загрузить отдельный модуль ожидания. Я бы предложил Chai с плагином chai-as-promised. (chai-as-обещанный упрощает процесс написания ожиданий вокруг обещаний. Транспортир переопределяет функцию expect() в Жасмине, чтобы сделать это за кулисами) Скорее всего, вы захотите сделать это в своем мире, поскольку это самый простой способ обеспечить доступ к нему в определениях шага. Ваш мир будет выглядеть примерно так:

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; 

Затем в вашем шаге Определения файл, который вы просто загрузить в мире согласно CucumberJS documentation и вы Шаг определения будет областью действия, чтобы обеспечить доступ ко всем свойствам мира:

module.exports = function() { 

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

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

Теперь, для некоторых бесстыдной саморекламы: если вы используете транспортир с CucumberJS, я бы рекомендовал смотреть на модуле я помог построить называюсь CukeFarm. Он поставляется с предварительно сконфигурированным несколькими модулями, которые вы найдете полезными, и содержит ряд общих определений шагов, которые можно использовать для большинства проектов.

+0

Mocha является система тестирования, которая позволяет использовать любой модуль ожидания, в том числе Chai. Является ли это одной из причин того, что Mocha популярен как единый модуль тестирования, так что тот же модуль ожиданий, который используется для написания тестов Cucumber, также может использоваться для написания модульных тестов, что делает более согласованным код, основанный на тестовом коде?Спасибо за ваш ответ и за рекомендацию CukeFarm! –

+0

@AristarkhArtemiy yep, это очень полезно, чтобы пойти на мокко. Используя те же шаблоны/синтаксис (например, chai) в ваших модульных тестах, и определения шага Огурца - это хорошо, особенно если другим людям приходится прыгать в кодовую базу. – jbpros

+0

Можете ли вы рассказать о причинах, почему CucumberJS и Жасмин являются взаимоисключающими? Я пытаюсь интегрировать CucumberJs в транспортир для запуска тестов E2E. Если бы я мог это сделать, это было бы так приятно. Стек, который я использую: Angular2, webpack, .. –

Смежные вопросы