53

我正在尝试在使用 http://newtriks.com/2013/12/31/automating-react-with-yeoman-and-grunt/生成的项目上从 Grunt 运行 Karma/Jasmine

Karma 启动 PhantomJS(或 Chrome),并且取决于 singleRun,它要么超时,要么只是坐在那里什么都不做。我已经尝试改变captureTimeoutbrowserNoActivityTimeout基于阅读有类似问题的人的解决方案,但它似乎不起作用。

我的相关包装版本等:

  • 节点JS:0.10.25
  • 业力:0.12.16
  • 网络包:1.1.11
  • 网络包开发服务器:1.4.1
  • 业力茉莉花:0.1.5
  • Linux:Ubuntu 14.04

我发现有人在 OS X 上遇到了同样的问题:

我已尝试将所有开发依赖项更新到最新版本,但问题仍然存在。

我的控制台输出如下。引用bundle 的 webpack 行现在是 VALID/INVALID令人担忧,但我找不到任何关于它们含义的信息。这是我的控制台输出:

Running "karma:unit" (karma) task
DEBUG [config]: autoWatch set to false, because of singleRun
DEBUG [plugin]: Loading karma-* from /home/ed/workspace/wwb-app/node_modules
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-chrome-launcher.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-coffee-preprocessor.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-firefox-launcher.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-html2js-preprocessor.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-jasmine.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-phantomjs-launcher.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-requirejs.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-script-launcher.
DEBG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-webpack-plugin.
INFO [karma]: Karma v0.12.16 server started at  http://localhost:8080/
INFO [launcher]: Starting browser PhantomJS
DEBUG [temp-dir]: Creating temp dir at /tmp/karma-98204612
DEBUG [launcher]: /home/ed/workspace/wwb-app/node_modules/karma-phantomjs-launcher/node_modules/phantomjs/lib/phantom/bin/phantomjs /tmp/karma-98204612/capture.js
Hash: 89285186567c1bc5bb7f
Version: webpack 1.1.11
Time: 2ms
Asset  Size  Chunks       Chunk Names
webpack: bundle is now VALID.
webpack: bundle is now INVALID.
DEBUG [web-server]: serving: /home/ed/workspace/wwb-app/node_modules/karma/static/client.html
DEBUG [web-server]: serving: /home/ed/workspace/wwb-app/node_modules/karma/static/karma.js
DEBUG [web-server]: upgrade /socket.io/1/websocket/CjC8pnQq5It2z_kWYB98
DEBUG [karma]: A browser has connected on socket CjC8pnQq5It2z_kWYB98
INFO [PhantomJS 1.9.7 (Linux)]: Connected on socket CjC8pnQq5It2z_kWYB98 with id 98204612
DEBUG [launcher]: PhantomJS (id 98204612) captured in 1.704 secs
WARN [PhantomJS 1.9.7 (Linux)]: Disconnected (1 times), because no message in 30000 ms.

DEBUG [karma]: Run complete, exitting.
DEBUG [launcher]: Disconnecting all browsers
DEBUG [launcher]: Process PhantomJS exited with code 0
DEBUG [temp-dir]: Cleaning temp dir /tmp/karma-98204612
Warning: Task "karma:unit" failed. Use --force to continue.

Aborted due to warnings.

这是我的karma.conf.js文件:

'use strict';

module.exports = function (config) {
config.set({
    basePath: '',
    frameworks: ['jasmine'],
    files: [
        'test/helpers/**/*.js',
        'test/spec/components/**/*.js'
    ],
    preprocessors: {
        'test/spec/components/**/*.js': ['webpack']
    },
    webpack: {
        cache: true,
        module: {
            loaders: [{
                test: /\.css$/,
                loader: 'style!css'
            }, {
                test: /\.gif/,
                loader: 'url-loader?limit=10000&minetype=image/gif'
            }, {
                test: /\.jpg/,
                loader: 'url-loader?limit=10000&minetype=image/jpg'
            }, {
                test: /\.png/,
                loader: 'url-loader?limit=10000&minetype=image/png'
            }, {
                test: /\.js$/,
                loader: 'jsx-loader'
            }]
        }
    },
    webpackServer: {
        stats: {
            colors: true
        }
    },
    exclude: [],
    port: 8080,
    logLevel: config.LOG_DEBUG,
    colors: true,
    autoWatch: true,
    // Start these browsers, currently available:
    // - Chrome
    // - ChromeCanary
    // - Firefox
    // - Opera
    // - Safari (only Mac)
    // - PhantomJS
    // - IE (only Windows)
    browsers: ['PhantomJS'],
    reporters: ['progress'],
    captureTimeout: 60000,
    browserNoActivityTimeout: 60000,
    singleRun: true
});
};
4

12 回答 12

49

我有同样的问题。从相关的GitHub 问题中,我了解到您可以延长不活动超时。

在您的 gruntfile 或 karma 配置文件中设置此 Karma 配置选项:

browserNoActivityTimeout: 100000

我将它设置为 100 秒,我的测试成功运行。我不知道是什么导致了延迟。

于 2014-07-22T16:51:20.777 回答
33

我已将 Karma 配置更改为

captureTimeout: 60000, // it was already there
browserDisconnectTimeout : 10000,
browserDisconnectTolerance : 1,
browserNoActivityTimeout : 60000,//by default 10000

我也有 200-300 次测试,PhantomJS 1.9.8,它只需要大约 100 mb 的 Phantom 内存与 grunt 和 karma 他们一起使用了大约 300mb 的内存。

于 2015-11-19T11:43:34.240 回答
16

我们在构建服务器上遇到了类似的问题。

增加 browserNoActivityTimeout 工作到一定程度。我们将它提高到 60000 毫秒,但是随着单元测试数量的增加,phantomJS 没有断开连接的问题又回来了。

我们最终将问题追溯到 phantomJS 可用的 RAM。我们有 1100 个单元测试需要大约 1 分 30 秒才能运行,但 phantomJS 将无法在 60000 毫秒超时内断开连接。

构建节点 VM RAM 从 2GB 增加到 4GB,然后 1100 个单元测试需要大约 45 秒才能运行,而 phantomJS 会在大约 5 秒后断开连接。一个巨大的进步。

有两个教训: 1. PhantomJS 需要大量内存,因此请确保它有足够的 RAM 来完成它的工作 2. 分析您的代码以了解在哪些方面可以提高内存使用效率。

于 2014-12-05T20:31:04.953 回答
7

另一个可能的解释是 RequireJS 挡道了。如果我将 'requirejs' 添加到 config.frameworks 数组中的 karma.conf.js,我会得到这个确切的错误。这似乎覆盖了本机 require 函数并导致无法执行测试。在我的情况下,描述块被触发,但如果它块被触发,则没有。

于 2015-10-20T13:20:04.807 回答
4

就我而言,我的 test.js 文件中没有包含以下代码:

requirejs.config({
    callback: window.__karma__.start
});

describe('tests', function() {
    ...

包含此配置后,测试开始运行。希望这可以减轻其他人的压力!

于 2016-07-19T10:53:32.893 回答
3

从业力配置文件中删除“要求”,只需使用框架:['jasmine']。

于 2015-12-21T17:01:33.743 回答
2

检查localhost是否正确指向127.0.0.1而不是无法访问的 IP,例如,这可能发生在使用虚拟机的开发环境中。

于 2016-09-19T13:23:14.450 回答
1

我为自己的环境解决了这个问题。我在全球范围内安装了一堆 nodejs 包。我没有做回归来弄清楚究竟是什么包导致了问题,但我强烈怀疑全球安装 karma 是原因。

如果您遇到此问题,请尝试

sudo npm -g remove karma

如果这不起作用,那么我将删除所有全局节点包(例如,像 yeoman、grunt-cli 这样的真正全局包除外)。然后为您的项目在本地安装。

我还注意到,当您sudo npm -i在 OS X 上运行时,它会将~/.npm的所有者更改为root并且后续npm -i命令将失败并出现EACCESS错误。

于 2014-07-17T07:19:43.210 回答
1

此处的 OP 可能不是这种情况,但是如果您正在测试的代码遇到无限循环,则会像这样导致超时断开连接。

于 2017-11-03T14:30:47.610 回答
1

这就是我收到此错误的原因,可能会对处于类似情况的人有所帮助。我的主要组件有多个使用不同服务的子组件,其中一个服务有一个 HTTP 调用,并且初始化失败,因为我在子组件的 ngInit() 方法中使用该服务。为了解决这个问题,我必须在主要组件规范中导入上述服务并为该服务附加一个模拟,之后它开始工作。

于 2019-10-23T16:23:04.383 回答
0

@Vijender 的回答让我走上了正轨

就像HttpClientModule在测试中用HttpClientTestingModule.

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        HttpClientTestingModule
      ]
    }).compileComponents();
  }));
于 2020-06-02T08:54:41.423 回答
0

我通过在我的 Root.tsx 中删除对全局范围内的异步函数的调用来解决此问题。

它在“真实”浏览器窗口中工作,但在测试运行中不起作用。

它似乎使加载模块本身挂起,所以它甚至没有执行异步函数(所以日志语句不会显示)

编辑:这是由另一个异步函数引起的,在应用程序启动时运行,它试图进行身份验证并重定向到另一个 URL。这就是它在浏览器中工作但在无头模式下工作的原因。如果没有任何异步测试功能,身份验证代码就没有机会阻塞系统。通过异步测试,异步身份验证代码开始运行并导致锁定。

故事的寓意:如果异步测试挂起,请检查后台正在执行的其他异步代码。

于 2021-10-21T13:38:55.470 回答