如何将 Jasmine 与 CucumberJS 一起使用?

How can I use Jasmine with CucumberJS?

如何将 jasmine 与 cucumberjs 一起使用?

我尝试了

中的这个解决方案

但我总是遇到这个错误:TypeError: this.expect(...).toBe 不是 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",
  }
}

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

由于您使用 CucumberJS 来构建测试,因此您需要使用一个单独的断言库,最流行的是 Chai。您需要使用函数 provided by Chai 进行断言。在您的情况下,您可能希望使用 equal() 函数。还要记住 Protractor 的 isPresent() 函数 returns 是一个承诺,因此您需要使用 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);

您可以使用我们的 jasmine-expect 库。我们从 Jasmine 中取出了 expectation 库,作为一个单独的模块发布。

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