1

我以这个问题为例:

使用没有 ES6 语法的 Nightmare.js 和 yield

但是如果我把它放在摩卡测试中,这将超时,这里的代码:

describe('Google', function() {
it('should do things', function(done) {
    var x = Date.now();
    var nightmare = Nightmare();
    Promise.resolve(nightmare
        .goto('http://google.com')
        .evaluate(function() {
            return document.getElementsByTagName('html')[0].innerHTML;
        }))
    .then(function(html) {
        console.log("done in " + (Date.now()-x) + "ms");
        console.log("result", html);
        expect(html).to.equal('abc');
        done();
        return nightmare.end();
    }).then(function(result) {

    }, function(err) {
        console.error(err); // notice that `throw`ing in here doesn't work
    });
});
});

但问题是done()从未调用过。

4

2 回答 2

2

我使用 mocha-generators 插件来做产量。以下是我将如何构建您的代码:

require('mocha-generators').install();

var Nightmare = require('nightmare');
var expect = require('chai').expect;

describe('test login', function() { 

  var nightmare;

  beforeEach(function *() {
    nightmare = Nightmare({
      show: true,
    });

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

  it('should go to google', function*() {
    this.timeout(5000);

    var result = yield nightmare
      .goto('http://google.com')
      .dosomeotherstuff

    expect(result).to.be('something')
  });

});

如果您使用生成器,则不需要 done,因为 done 是处理异步的回调

于 2015-12-11T16:48:00.500 回答
0

你应该在评估之后移动 .end() 之后的结尾,否则你会得到很多错误,比如 done() 没有被调用,也因为电子过程没有关闭而超时。

describe('Google', function() {
   it('should do things', function(done) {
    var x = Date.now();
    var nightmare = Nightmare();
    nightmare
        .goto('http://google.com')
        .evaluate(() => {
            return document.getElementsByTagName('html')[0].innerHTML;
        })
        .end()
        .then( (html) => {
            console.log("done in " + (Date.now()-x) + "ms");
            console.log("result", html);
            expect(html).to.equal('abc');
            done();
        })
        .catch(done);
    });
});
于 2017-04-25T21:17:08.313 回答