一个失败的测试导致其他异步测试失败

时间:2017-08-18 06:54:53

标签: javascript unit-testing asynchronous jasmine karma-runner

我有一个非常基本的业力/茉莉花设置,其中一个测试套件包含两个测试。我希望第一次测试失败,第二次测试通过。

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

2 个答案:

答案 0 :(得分:2)

问题确实存在于Karma Debug Runner的Debug.js文件中,正如@user907860已经暗示的那样。茉莉花并不特别。我有reported the issuecreated 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文件中):

  1. Jasmine运行第一个规范但它失败了;
  2. Karma在日志中报告这个并添加了一个函数,它会向堆栈抛出一个错误(我假设读者知道JavaScript中的异步模型,如果没有,那么他必须在类似的东西中读到这个 &#34;有效的JavaScript:68种利用JavaScript的强大功能和#34;作者:David Herman ,一本真正的宝石书,或其他地方)。此外,这很重要,虽然我不确定,因为我还没有深入研究代码,它会记录下这种&#34; globalError&#34;,因为下一步
  3. Jasmine运行第二个规范,并调用getJasmineRequireObj().GlobalErrors函数(jasmine.js:2204)。 &#34; globalError&#34;检测到并且规范立即变为失败。在Karma的函数之后,异步期望被添加到堆栈中,该函数抛出错误
  4. 然后第一个函数(抛出错误)开始执行,添加它抛出。此函数将始终在Jasmine异步规范之前调用,因为在debug.js中没有时间传递给setTimeout调用:

    //notice the absent time argument setTimeout(function () { throw err })

  5. Jasmine从第二个规范运行assync,它通过了

  6. Karma将第二个规范报告为失败并添加错误抛出(如果未注释掉,则没有错误发生且此规范通过)到堆栈
  7. Karma的第二个错误被抛出
  8. 下面是带有数字的屏幕截图,由我来说明列表中的步骤:

    throw文件中未注释debug.js

    karma jasmine errors step by step

    以及评论throw

    karma jasmine without throwing in the debug.js file