为什么Mocha会在记者完成测试失败之前退出?

时间:2013-09-20 13:27:27

标签: javascript selenium-webdriver mocha

我正在使用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承诺都没有得到解决,这显然不是我的预期。

但是,我发现如果在定义了这些promise之后抛出异常(例如在driver.takeScreenshot()之后),Mocha会立即终止而没有正确的报告或错误消息(好的到目前为止,即使我希望得到一个“Reporter引发意外异常”消息,但解决了两个WebDriver承诺,以便截取屏幕截图并在退出之前打印当前URL。

我正在玩一个只有几个测试的小测试套件,所以我假设可能Mocha认为钩子完成并返回操作系统,然后才能有机会解决。还有另一种解释吗?我在这里有错还是摩卡?我该如何妥善解决这个问题?

PS:selenium-webdriver及其承诺框架完全有可能在这里出错。但是,我不想指责,但找到解决方案,我对这种现象的任何解释感到高兴。

1 个答案:

答案 0 :(得分:1)

回答我自己的问题:似乎Mocha目前无法在其钩子中使用异步功能。我在Github上打开了issue这个。

更新:我已经解决了问题并记录在上面的问题中。问题是Mocha上的wiki条目,描述了程序化测试运行,它使用了直接process.exit()而不是异步process.on("exit", ...)