Karma 运行器不会运行所有文件



出于一些我无法理解的奇怪原因,我的业力运行器有时不会运行所有测试文件。

业力.js:

module.exports = function(config) {
config.set({
    basePath: '',
    frameworks: ['jasmine'],
    files: [
        '../lib/angular/angular.min.js',
        '../lib/angular-mocks/angular-mocks.js',
        '../lib/angular-notify/dist/angular-notify.min.js',
        '../lib/JsCollection/dist/jscollection-0.1.5.min.js',
        '../lib/lodash/dist/lodash.min.js',
        'node_modules/jasmine-ajax/lib/mock-ajax.js',
        'app/**/*.js',
        'tests/**/*.js'
    ],
    plugins: [ 'karma-jasmine', 'karma-phantomjs-launcher'],
    reporters: ['progress'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['PhantomJS'],
    singleRun: false
});
};

所以这就是发生的事情,我运行我的测试,一切都开始很好:

oli@devone:~/projects/2bi/public/src$ karma start
03 06 2016 11:40:44.861:WARN [karma]: No captured browser, open http://localhost:9876/
03 06 2016 11:40:44.921:INFO [karma]: Karma v0.13.22 server started at http://localhost:9876/
03 06 2016 11:40:44.967:INFO [launcher]: Starting browser PhantomJS
03 06 2016 11:40:46.764:INFO [PhantomJS 2.1.1 (Linux 0.0.0)]: Connected on socket /#qmOPHCmxWaFWMmvrAAAA with id 14003688
PhantomJS 2.1.1 (Linux 0.0.0): Executed 46 of 46 SUCCESS (0.708 secs / 0.888 secs)

所以我的 46 个测试正常执行,一切都很好,很花花公子。然后我开始编码,业力开始表现得很奇怪,它有时不会运行所有测试,但有时它会运行。通常它只运行 16 个测试,所以我必须重新启动它才能再次运行所有测试。

在这里,我更改了几次公式测试:

03 06 2016 11:42:25.059:INFO [watcher]: Removed file "/home/oli/projects/2bi/public/src/tests/common/services/Formula.test.js".
PhantomJS 2.1.1 (Linux 0.0.0): Executed 16 of 16 SUCCESS (0.18 secs / 0.255 secs)
03 06 2016 11:42:32.882:INFO [watcher]: Added file "/home/oli/projects/2bi/public/src/tests/common/services/Formula.test.js".
03 06 2016 11:42:32.967:INFO [watcher]: Changed file "/home/oli/projects/2bi/public/src/tests/common/services/Formula.test.js".
PhantomJS 2.1.1 (Linux 0.0.0): Executed 46 of 46 SUCCESS (0.465 secs / 0.598 secs)
03 06 2016 11:43:12.529:INFO [watcher]: Removed file "/home/oli/projects/2bi/public/src/tests/common/services/Formula.test.js".
PhantomJS 2.1.1 (Linux 0.0.0): Executed 16 of 16 SUCCESS (0.136 secs / 0.246 secs)
03 06 2016 11:43:20.094:INFO [watcher]: Added file "/home/oli/projects/2bi/public/src/tests/common/services/Formula.test.js".
03 06 2016 11:43:20.183:INFO [watcher]: Changed file "/home/oli/projects/2bi/public/src/tests/common/services/Formula.test.js".
PhantomJS 2.1.1 (Linux 0.0.0): Executed 46 of 46 SUCCESS (0.506 secs / 0.626 secs)

一切都在虚拟机器上运行,但文件系统是本地的。

有人知道发生了什么吗?

我也有类似的情况,问题是单元测试中使用的setTimeout。下面是导致 Karma 在运行所有测试时随机失败的测试的代码示例:

it('should test something', () => {
    ...
    setTimeout(() => {
        expect(...)
    }, 0)
})

因为setTimeout业力不知道测试是否完成,所以解决方案是在测试完成时告诉业力。这是修复:

it('should test something', (done) => {
    ...
    setTimeout(() => {
        expect(...)
        done()
    }, 0)
})

这解决了我们的问题,现在所有测试都正常运行。

编辑器存储到临时文件并替换原始文件似乎是问题所在。

我正在使用 JetBrains RubyMine。取消选中使用"安全写入"(先将更改保存到临时文件)修复了此问题。

经过一番研究,事实证明业力观察者可能会有一些问题。

在这种特殊情况下,对我有帮助的是karma.conf.js中添加usePolling: false

如果有人有这个问题,我会把这个留在这里。

最新更新