Karma在启动时找不到测试文件,但在重新加载

时间:2017-05-18 12:33:37

标签: angular jasmine karma-runner angular-cli

我有一个带有茉莉花测试的Angular 4项目和Karma测试跑步者。我从DavideViolantes首发(github)开始,并且根据我的需要改变它有很好的经验。

最近几天我花了很多时间编写测试,并使用单独的Karma配置文件与我的模型分开测试Angular组件。我开始编写模型测试,一切正常。然后我编写了组件测试,它们也运行良好。但后来我注意到模型测试中有一种奇怪的行为。

当我为模型测试运行ng test时(显式给出正确的karma.conf.js)没有找到测试文件。 webpack上下文对象为空,浏览器显示" 0规格,0失败"。

如果我然后触摸一个监视文件,webpack上下文将加载所有测试文件,浏览器会显示每个测试。

我唯一的猜测是事情发生得太晚,因此第二次运行就到位了。

日志显示没有错误。配置文件基本上与组件测试的文件相同。

任何调试提示?

karma.config.js:

module.exports = function (config) {
  config.set({
    basePath: '..',
    frameworks: ['jasmine', '@angular/cli'],
    plugins: [
      'karma-jasmine',
      'karma-chrome-launcher',
      'karma-jasmine-html-reporter',
      'karma-coverage-istanbul-reporter',
      '@angular/cli/plugins/karma',
    ],
    client:{
      clearContext: false
    },
    files: [
      { pattern: 'common/test.ts', watched: false }
    ],
    preprocessors: {
      'common/test.ts': ['@angular/cli']
    },
    mime: {
      'text/x-typescript': ['ts','tsx']
    },
    coverageIstanbulReporter: {
      reports: [ 'html', 'lcovonly' ],
      fixWebpackSourcePaths: true
    },
    angularCli: {
      environment: 'dev'
    },
    reporters: config.angularCli && config.angularCli.codeCoverage
              ? ['progress', 'coverage-istanbul']
              : ['progress', 'kjhtml'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['Chrome'],
    singleRun: true
  });
};

test.ts:

import 'zone.js/dist/long-stack-trace-zone';
import 'zone.js/dist/proxy';
import 'zone.js/dist/sync-test';
import 'zone.js/dist/jasmine-patch';
import 'zone.js/dist/async-test';
import 'zone.js/dist/fake-async-test';
import { getTestBed } from '@angular/core/testing';
import {
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';

declare var __karma__: any;
declare var require: any;

__karma__.loaded = function () {};

getTestBed().initTestEnvironment(
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting()
);

const context = require.context('./', true, /\.spec\.ts$/);
context.keys().map(context);
__karma__.start();

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题。我正在使用两个源文件夹。因此,我已经实现了上下文,以便在两个文件夹中进行搜索。

const context = require.context('../', true, /\/(@modules|src)\/.*\/.*\.spec\.ts$/);

如果我开始测试,只有'src'文件夹中的测试才会被发现。如果我通过观察者再次开始测试,则会找到所有测试(src& @modules)。

很疯狂,“错误输入”的中止伴随着第三次重装并且第四次重新加载所有内容都会再次发现并运行。这两个条件重复每次重新加载。我是否可以在每次“直线”运行中可靠地使用ng测试?可能很难在我的Jenkins环境中定义。

BTW我可以完全复制同样的问题。基本上每当测试不在默认源文件夹中时。