Кошмар с Мокко: Uncaught TypeError: Невозможно прочитать свойство 'apply' из неопределенного

Я пытаюсь запустить пример теста с Nightmare.js и Mocha, и я продолжаю получать ошибку выше. Вот полный вывод:

$ mocha nightmare-chai-example.js 


  Nightmare demo
    Start page
      1) should show form when loaded


  0 passing (716ms)
  1 failing

  1) Nightmare demo Start page should show form when loaded:
     Uncaught TypeError: Cannot read property 'apply' of undefined
      at Nightmare.done (/home/user/testing/node_modules/nightmare/lib/nightmare.js:313:14)
      at Nightmare.next (/home/user/testing/node_modules/nightmare/lib/nightmare.js:291:35)
      at /home/user/testing/node_modules/nightmare/lib/nightmare.js:301:46
      at EventEmitter.<anonymous> (/home/user/testing/node_modules/nightmare/lib/ipc.js:93:18)
      at ChildProcess.<anonymous> (/home/user/testing/node_modules/nightmare/lib/ipc.js:49:10)
      at handleMessage (internal/child_process.js:695:10)
      at Pipe.channel.onread (internal/child_process.js:440:11)

И вот код, который я запускаю:

var path = require('path');
var Nightmare = require('nightmare');
var should = require('chai').should();

describe('Nightmare demo', function() {
  this.timeout(15000); // Set timeout to 15 seconds

  var url = 'http://example.com';

  describe('Start page', function() {
    it('should show form when loaded', function(done) {
      new Nightmare()
        .goto(url)
        .evaluate(function() {
          return document.querySelectorAll('form').length;
        }, function(result) {
          result.should.equal(1);
          done();
        })
        .run();
    });
  });
});

Из этой сути.

Я использую Ubuntu 16.04 LTS на Oracle VM VirtualBox.

1 ответ

Решение

.run() ожидает обратного вызова и потерпит неудачу (с бесполезным выводом, как вы заметили) без него. Об этом сообщалось, и исправление было предложено.

Также стоит отметить, что .evaluate() не работает так, как описывается суть, которую вы указали, по крайней мере, для версий>2.x. .evaluate() Метод попытается отправить аргументы после вычисляемой функции (первый аргумент) в качестве аргументов этой функции.

Изменение внутри вашего it вызов:

  new Nightmare()
    .goto(url)
    .evaluate(function() {
      return document.querySelectorAll('form').length;
    })
    .run(function(err, result){
      result.should.equal(1);
      done();
    });

Стоит также отметить, что .run() предназначен для внутреннего использования, и он был рекомендован для устаревания в пользу реализации, подобной Promise, с использованием .then():

  new Nightmare()
    .goto(url)
    .evaluate(function() {
      return document.querySelectorAll('form').length;
    })
    .then(function(result){
      result.should.equal(1);
      done();
    });
Другие вопросы по тегам