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 for为stats
,但我不确定如何从测试文件中找到它们。
答案 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
中扫描测试的方法。但是,对于钩子和测试,只能使用包装器。