3

我开始使用 Protractor,我尝试做的第一件事是使用 Mocha 和 Chai 而不是 Jasmine。虽然现在我不确定这是否是个好主意。

首先我需要让 Chai 可以从所有规范文件中访问,而不必每次都导入,我发现可以在 protractor.conf 文件中进行操作:

  onPrepare: ->
      global.chai = require 'chai'
      chai.use require 'chai-string'
      chai.use require 'chai-as-promised'
      global.expect = chai.expect

现在在这样的规范中:

  it "when clicked should sort ",->
      headerColumns.get(0).click()
      firstCellText = $$(".first-cell").getText()
      secondCellText = $$(".second-cell").getText()

      # this won't work
      expect(firstCellText).eventually.be.above(secondCellText)             

为了使它工作,我可以做:

    # now this works
    $$(".second-cell").getText().then (secondCellText)->
        expect(firstCellText).eventually.be.above(secondCellText)             

但这很丑,我不想一直把东西包在里面.then。我在想应该有更好的方法(?)

4

3 回答 3

2

我遇到了同样的问题。我的问题是通过 Protractor config.js 为 mocha 添加更长的超时时间。

这是因为 Protractor 测试相对于其他模块(如 supertest)花费的时间要长得多,因为正在与实际的浏览器进行交互。

我添加了

  mochaOpts: {
   timeout: 5000
  }

到我的量角器配置并且测试通过了。

于 2015-03-13T21:39:02.820 回答
0

当我尝试在 TypeScript 中做同样的事情时,我发现了这个问题,但其中的方法protractor.conf.js是相同的。

在全球范围内提供 chai

看来要实现这一点,你是对的,它需要在准备中完成。下面是一个相当简洁的例子。据我了解,这是必需的,因为 chai 当然不是 mocha 的一部分,而是一些我们可以与 mocha 一起使用的额外糖果。与 jasmine 不同,所有东西都捆绑在框架中。

protractor.conf.js 片段

onPrepare: function() {
  var chai = require('chai'); // chai
  var chaiAsPromised = require("chai-as-promised"); // deal with promises from protractor
  chai.use(chaiAsPromised); // add promise candy to the candy of chai
  global.chai = chai; // expose chai globally
}

示例规范

一旦你在全球范围内完成了 chai 和 chai-as-promised 设置,你需要在你的规范中添加一个“小”样板来公开expect来自 chai 的内容。

example.e2e-spec.ts 片段

const expect = global['chai'].expect; // obviously TypeScript


it('will display its title', () => {
  pageObject.navigateTo();

  const title = element(by.css('app-root h1')).getText();
  expect(title).to.eventually.contain('An awesome title');
});

那时避免

我不知道您的$$参考资料是什么,但如果您使用量角器组件browser等,by那么事情会稍微清理一下。

这个电话const title = element(by.css('app-root h1')).getText();似乎返回了一个承诺,茉莉花似乎开箱即用,而 mocha+chai 却没有。这就是 chai-as-promised 的用武之地。

使用我们的额外语法 candyexpect(title).to.eventually.contain('An awesome title');非常巧妙地解决了承诺,我们避免了所有这些then调用,但我们确实需要eventually.

我为您提供了一个可能有助于演示的有效 TypeScript示例的链接。

于 2017-03-17T15:20:31.143 回答
0

您需要使用“this.timeout(1000);”为整个测试套件提及超时。就在 describe 块的下方,或者您可以通过为每个“it”块显式定义超时来为单个测试用例更改它。

描述块的示例

describe("test-suite",function () {
    this.timeout(5000);
    it("test-case",function () {
       //test case code goes here 
    });
});

它块的示例

it("test-case",function () {
        this.timeout("20000");
    });
于 2017-03-26T05:44:06.543 回答