我有一个非常基本的业力/茉莉花设置,其中一个测试套件包含两个测试。我希望第一次测试失败,第二次测试通过。
describe("The system", function() {
it("should fail", function() {
expect(true).toBe(false);
});
it("should succeed", function(done) {
setTimeout(function() {
expect(1).toBe(1);
done();
}, 10);
});
});
但是,当我在浏览器中运行这些测试并单击Debug按钮以打开Karma DEBUG RUNNER 时,我看到两个测试都失败了,第二个测试失败并出现<的错误消息em>第一次测试。常规测试运行(即不在Karma DEBUG RUNNER中)按预期工作。
第二次测试的错误消息是:
Uncaught Expected true to be false.
at UserContext.<anonymous> (http://localhost:9876/base/workingspec.js:4:22) thrown
当我禁用或删除第一个测试时,第二个测试通过。
为什么在这种情况下两个测试都失败了?为什么第二次测试失败并显示第一次测试的错误消息?
我的测试设置包含以下软件包/版本:
+-- jasmine-core@2.7.0
+-- karma@1.7.0
+-- karma-chrome-launcher@2.2.0
+-- karma-jasmine@1.1.0
`-- karma-jasmine-html-reporter@0.2.2
答案 0 :(得分:2)
问题确实存在于Karma Debug Runner的Debug.js
文件中,正如@user907860已经暗示的那样。茉莉花并不特别。我有reported the issue和created a fix刚刚合并到Karma的主分支中,所以下一个版本应该解决这个问题。
答案 1 :(得分:1)
起初我认为这是一个错误,但经过一些研究与辉煌的Chrome devtools,似乎这是一个预期的行为,至少是由Jasmine。但它可能是Karma框架中的一个错误。
简而言之,node_modules/karma/static/debug.js
文件(调试页面的js文件)有这些行(我有Karma v1.7.0
):
for (var i = 0; i < result.log.length; i++) {
// Throwing error without losing stack trace
(function (err) {
setTimeout(function () {
throw err
})
})(result.log[i])
}
如果您对throw行进行注释,并重新启动karma服务器,那么您只会看到控制台日志消息,这应该是预期的:首先是FAIL,然后是PASS,然后是摘要。
详细地说,Karma中的错误可能是在每个规范之后报告的行为。
这就是这里一步一步发生的事情(我有版本"jasmine-core": "^2.6.4"
,至少这是在我的package.json
文件中):
getJasmineRequireObj().GlobalErrors
函数(jasmine.js:2204
)。 &#34; globalError&#34;检测到并且规范立即变为失败。在Karma的函数之后,异步期望被添加到堆栈中,该函数抛出错误然后第一个函数(抛出错误)开始执行,添加它抛出。此函数将始终在Jasmine异步规范之前调用,因为在debug.js
中没有时间传递给setTimeout
调用:
//notice the absent time argument
setTimeout(function () {
throw err
})
Jasmine从第二个规范运行assync,它通过了
下面是带有数字的屏幕截图,由我来说明列表中的步骤:
在throw
文件中未注释debug.js
以及评论throw
: