如何使用Jasmine和CucumberJS与量角器

时间:2015-06-09 19:11:39

标签: angularjs testing jasmine cucumber protractor

我希望使用Protractor,CucumberJS和Jasmine来测试我的项目。如何将Jasmine和CucumberJS与Protractor一起使用?这是我创建的项目设置:

/路径/到/的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'
  }
};

正如您所看到的,这个项目使用" cucumber"作为框架。如何在CucumberJS中添加Jasmine框架?这是通过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();
  });
};

执行此操作时,"期待"没有定义,可能是因为Jasmine没有被整合,并且它期望全球化。这是完整的错误消息:

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

注意:我在package.json中使用了对Protractor Git存储库的特定提交,因为最新版本(2.1.0)具有a bug,这阻止了与CucumberJS的集成。

2 个答案:

答案 0 :(得分:23)

CucumberJS和Jasmine互相排斥;你将无法在黄瓜的步骤中使用Jasmine的期望。你需要做的是加载一个单独的期望模块。我建议使用Chai插件chai-as-promised。 (chai-as-promised简化了围绕承诺编写期望的过程。量角器覆盖了Jasmine中的expect()函数,以便在幕后为您执行此操作)很可能您希望在您的World中执行此操作,因为这是在步骤定义中提供对它的访问的最简单方法。你的世界看起来像这样:

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();
  });
};

现在,对于一些无耻的自我推销:如果你使用Protractor和CucumberJS,我建议你看看我帮助构建的一个名为CukeFarm的模块。它预先配置了一些你会发现有用的模块,它提供了许多可用于大多数项目的通用步骤定义。

答案 1 :(得分:0)