如何将Jasmine与CucumberJS一起使用

How can I use Jasmine with CucumberJS?

本文关键字:一起 CucumberJS Jasmine      更新时间:2023-09-26

如何将茉莉花与cucumberjs搭配使用?

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

但我一直有这样的错误: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;

量角器.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。您需要使用Chai提供的函数来进行断言。在您的情况下,您可能希望使用equal()函数。还要记住,Protractor的isPresent()函数返回一个promise,因此您需要使用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中取出期望库,并将其作为一个单独的模块发布。

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