【问题标题】:How can I use Jasmine with CucumberJS?如何将 Jasmine 与 CucumberJS 一起使用?
【发布时间】:2015-12-02 14:48:23
【问题描述】:

如何将茉莉花与 cucumberjs 一起使用?

我从https://stackoverflow.com/a/30763260/5453732尝试了这个解决方案

但我总是遇到这个错误:TypeError: this.expect(...).toBe is not a function at World。 (/myApp/tests/e2e/steps/main.step.js:33:79)

第 39 行:

this.expect(element(by.css('[data-el="' + field + '"]')).isPresent()).toBe(true);

app/modules/user/tests/e2e/user.feature

#user.feature

Feature: Login feature
  As a user
  I want authenticate my account

  Scenario: Authentication success
    Given I am on "#/" page
    Given I check if "navbar-menu-user-module" is visible
    Given I wait "3" seconds

/tests/e2e/steps/main.step.js

module.exports = function () {

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

    this.path = '#/';

    this.Given(/^I am on "?([^"]*)"? page$/, function (arg1, callback) {
        browser.get(arg1);
        callback();
    });

    this.Given(/^I wait "?([^"]*)"? seconds$/, function (arg1, callback) {
        browser.sleep(3000);
        callback();
    });

    this.Given(/^I check if "?([^"]*)"? is visible$/, function (field, callback) {
        this.expect(element(by.css('[data-el="' + field + '"]')).isPresent()).toBe(true);
        callback();
    });
};

/tests/e2e/support/world.js

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;

protractor.conf.js

/* protractor.conf.js */
exports.config = {
  directConnect: true,

  seleniumServerJar: 'node_modules/selenium-server/lib/runner/selenium-server-standalone-2.48.2.jar',

  specs: [
      'app/modules/user/tests/e2e/*.feature'
  ],

  getPageTimeout: 30000,

  capabilities: {
    'browserName': 'chrome',
    version: '',
    platform: 'ANY'
  },

  onPrepare: function() {
      var width = 1024, height = 800;

      browser.get('#/');
      browser.driver.manage().window().setSize(width, height);
  },

  framework: 'cucumber',

  cucumberOpts: {
    require: [
        'tests/e2e/steps/main.step.js'
    ],
    format: 'pretty', // or summary
    keepAlive: false
  },

  onCleanUp: function() {}

};

还有我的html:

<a data-el="navbar-menu-user-module" href="./#/user">User Module</a>

package.json

{
  "name": "myApp",
  "version": "1.0.0",
  "description": "myApp",
  "dependencies": {
  },
  "devDependencies": {
    "chai": "^3.3.0",
    "chai-as-promised": "^5.1.0",
    "jasmine-core": "~2.3.4",
    ...
    "protractor": "^2.5.1",
    "selenium-server": "^2.48.2",
    "selenium-standalone": "^4.7.0",
    "selenium-webdriver": "^2.48.0",
  }
}

【问题讨论】:

    标签: javascript jasmine protractor bdd cucumberjs


    【解决方案1】:

    要记住的关键是 CucumberJS 和 Jasmine 是互斥的。您只能将 Jasmine 的 expect 与 Jasmine 框架结合使用。 toBe() 是 Jasmine 的 expect 提供的一个函数,它在你的框架中不存在。这就是您收到您描述的错误的原因。

    由于您使用 CucumberJS 来构建您的测试,您需要使用一个单独的断言库,最流行的一个是 Chai。您需要使用函数provided by Chai 进行断言。在您的情况下,您可能希望使用 equal() 函数。还请记住,Protractor 的 isPresent() 函数返回一个承诺,因此您需要使用 chai-as-promised 提供的 eventually 链。总之,以下断言:

    this.expect(element(by.css('[data-el="' + field + '"]')).isPresent()).toBe(true);
    

    应该改为:

    this.expect(element(by.css('[data-el="' + field + '"]')).isPresent()).to.eventually.equal(true);
    

    【讨论】:

    • 谢谢!!使用这种语法就可以了!
    【解决方案2】:

    您可以使用我们的 jasmine-expect 库。我们从 Jasmine 中取出期望库,并将其作为单独的模块发布。

    https://www.npmjs.com/package/xolvio-jasmine-expect

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-10
      • 2013-07-10
      相关资源
      最近更新 更多