0

我正在将 NightmareJS 与 Mocha 一起使用。一切似乎都很好,但是我在分离测试时遇到了问题,因为我的会话不会通过不同的测试用例持续存在。

第一个测试通过了,但是第二个测试Should be able to edit失败了,因为即使我使用了分区选项,我最终还是在同一个登录页面上。我该如何克服呢?

require('mocha-generators').install();
var Nightmare = require('nightmare');
var expect = require('chai').expect;

describe('Nightmare JS tests', function() {
  this.timeout(30000);

  var url = 'http://localhost/app/';

  describe('base functionality', function() {

    it('Should be able to login', function*() {
        var nightmare = Nightmare({
            show: true,
            'webPreferences': {
                partition: 'persist:somesession'
            }
        });
        var result = yield nightmare
                .goto(url)
                .wait('.login')
                .click('.login')
                .wait('h4.heading')
                .wait(1000)
                .evaluate(function () {
                    return document.querySelector('h4.heading').innerHTML;

                })
                .end();

        expect(result).to.equal("This is heading");

    });

    it('Should be able to edit', function*() {
        var nightmare = Nightmare({
            show: true,
            'webPreferences': {
                partition: 'persist:somesession'
            }
        })
        var result = yield nightmare
                .goto('http://localhost/app/company')
                .wait("button.edit")
                .click("button.edit")
                .wait("input[type='text']")
                .insert("input[type='text']", false)
                .insert("input[type='text']", "This is some address")

                .click("button[type='submit']")
                .wait("div.success")
                .evaluate(function () {
                    return document.querySelector("div.success").innerText;

                })
                .end()

        expect(result).to.contain("Updated!");

    });
  });
});
4

1 回答 1

5

关于共享会话的 Nightmare Github 项目(参见#430#398以获取更多信息)围绕此主题进行了一些讨论。TL;DR 版本是您可以重置会话,但跨实例使用相同的会话没有经过很好的测试。(从你的例子来看,看起来你可能已经看过这些了。)

无论如何,我想我可以帮助您解决眼前的问题。两个建议:

  1. 使用相同的实例。 您可以将 Nightmare 实例的创建移动到一个before()块中,并为您的测试使用相同的实例。但是,这会引入测试依赖性,并且通常被认为是不可取的。
  2. 将整个登录过程移到一个beforeEach()块中。将整个登录单元测试移动到一个beforeEach()块中,这样您就可以为每个测试重新登录。您还需要添加一个afterEach()块来清理噩梦实例。这将使您的测试可以独立运行,但也会为运行整个单元测试电池引入大量时间开销。

基于您的样本的#2 的(未经测试的)示例可能会有所帮助:

require('mocha-generators').install();
var Nightmare = require('nightmare');
var expect = require('chai').expect;

describe('Nightmare JS tests', function() {
  this.timeout(30000);

  var url = 'http://localhost/app/';

  describe('base functionality', function() {
    var nightmare;
    beforeEach(function*() {
      nightmare = Nightmare({
        show: true,
      });
      yield nightmare
        .goto(url)
        .wait('.login')
        .click('.login')
        .wait('h4.heading')
        .wait(1000)
    });

    afterEach(function*() {
      yield nightmare.end();
    });

    it('Should be able to edit', function*() {
      var result =
        yield nightmare
        .goto('http://localhost/app/company')
        .wait("button.edit")
        .click("button.edit")
        .wait("input[type='text']")
        .insert("input[type='text']", false)
        .insert("input[type='text']", "This is some address")

      .click("button[type='submit']")
        .wait("div.success")
        .evaluate(function() {
          return document.querySelector("div.success").innerText;

        });
      expect(result).to.contain("Updated!");

    });
  });
于 2016-02-22T15:58:32.427 回答