Кошмар с Мокко: 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();
});