0

Mocha で NightmareJS を使用しています。すべてが正常に機能しているように見えますが、セッションが異なるテストケースで持続しないため、テストを分離するのに問題があります。

最初のテストは問題なくパスShould be able to editしますが、パーティション オプションを使用しているにもかかわらず同じログイン ページが表示されるため、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() {

    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 バージョンでは、セッションをリセットできますが、インスタンス間で同じセッションを使用することは十分にテストされていません。(あなたの例から判断すると、これらはすでに見たことがあるようです。)

いずれにせよ、当面の問題を解決するお手伝いができると思います。2 つの提案:

  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 に答える