我如何检查后块中是否有任何mocha测试失败?

时间:2014-02-26 04:30:23

标签: javascript testing mocha

describe('some tests', function () {
  /*
   * Run some tests...
   */
})

after(function () {
  failures = ? // <--- what goes here?
  console.log(failures + " tests failed!")
})

如果测试失败,我会用它来保持chromedriver的浏览器打开,并report success or failure to sauce labs

Mocha的Runner和Reporters have the info I'm looking forstats,但我不确定如何从测试文件中找到它们。

2 个答案:

答案 0 :(得分:5)

我找到了这个问题的答案here

afterEach(function() {
  if (this.currentTest.state == 'failed') {
    // ...
  }
});

答案 1 :(得分:3)

快速检查代码后,我相信after中的代码无法访问跑步者或记者。但是,有一种方法可以在运行时获取测试状态:

describe("blah", function () {

    it("blah", function () {
        throw new Error("blah");
    });

    after(function (){
        var failed = false;
        var tests = this.test.parent.tests;
        for(var i = 0, limit = tests.length; !failed && i < limit; ++i)
            failed = tests[i].state === "failed";
        if (failed)
            console.log("FAILED");
    });
});

查看第var tests = this.test.parent.tests行。我相信this.test似乎是与after调用关联的测试对象。 this.test.parent的值是与顶级describe关联的套件对象。 this.test.parent.tests的值是该套件中的测试列表。因此,那里的代码经历了每个测试,并检测测试是否处于"failed"状态。

上面代码中使用的所有变量都没有标记为私有(通过使用名称中的前导下划线)。同时,无法保证未来版本的Mocha将使用完全相同的结构。

所有测试失败都是例外,因此为了捕获挂钩失败,我会用检测异常的代码包装钩子。这是一个概念验证,展示了如何完成(并且我已将前一个示例中的一些代码移动到has_failed函数中):

var hook_failure = false;
function make_wrapper(f) {
    return function wrapper() {
        try {
            f.apply(this, arguments);
        }
        catch (e) {
            hook_failure = true;
            throw e;
        }
    };
}

function has_failed(it) {
    var failed = false;
    var tests = it.test.parent.tests;
    for(var i = 0, limit = tests.length; !failed && i < limit; ++i)
        failed = tests[i].state === "failed";
    return failed;
}

describe("blah", function () {

    before(make_wrapper(function () {
        throw new Error("yikes!");
    }));

    it("blah", function () {
        throw new Error("q");
    });

    after(function (){
        var failed = has_failed(this);
        if (failed)
            console.log(this.test.parent.title + " FAILED");
    });
});

after(function () {
    if (hook_failure)
        console.log("HOOK FAILURE");
});

在上面的示例中,我使用包装器方法after中扫描测试的方法。但是,对于钩子测试,只能使用包装器。