![](/img/trans.png)
[英]Why is mocha test throwing "Error done() called multiple times in hook <"before each" ....>?
[英]Why does Mocha exit before a reporter is done handling a test failure?
我正在使用PhantomJS(通过selenium-webdriver
)和Mocha编写测试套件。 为了进行报告,每次测试失败时我都需要一个屏幕截图,因此我根据spec
报告者为Mocha编写了自定义报告者:
module.exports = Screenshot;
var Spec = require('mocha/lib/reporters/spec');
var fs = require('fs');
// custom library generating PhantomJS instances
var phantoms = require("phantoms");
function Screenshot(runner) {
Spec.call(this, runner);
runner.on('fail', function(test, err){
var driver = phantoms.getDriver();
driver.getCurrentUrl().then(function(url) {
console.log(url);
});
console.log('This works');
driver.takeScreenshot().then(function(img) {
console.log("Writing screenshot");
fs.writeFileSync("/tmp/selenium.png", img, 'base64');
return "/tmp/selenium.png";
});
console.log('This also works');
});
}
Screenshot.prototype.__proto__ = Spec.prototype;
现在,当测试失败时,我遇到了一个有趣的情况:Mocha从钩子回调执行所有同步操作(例如,两个日志记录语句),但是getCurrentUrl
诺言和takeScreenshot
诺言都没有得到解决,这显然不是我期望的。
但是,我发现,如果我在定义了这些承诺后抛出异常(例如,在driver.takeScreenshot()
),则Mocha会立即终止,而没有正确的报告或错误消息(到目前为止,即使我愿意宁愿收到“ Reporter引发了意外的异常”消息),但同时解决了WebDriver的承诺,因此将截取屏幕截图,并在退出前打印当前URL。
我仅使用一个包含几个测试的小型测试套件,因此我假设Mocha可能认为挂钩已完成并在答应机会得到解决之前返回OS。 还有另一种解释吗? 我在这里错吗?还是摩卡咖啡? 如何正确解决此问题?
PS: selenium-webdriver
及其selenium-webdriver
框架很有可能在这里selenium-webdriver
。 但是,我不想怪罪,而是找到解决办法,我对此种现象的任何解释感到高兴。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.