使用 angular4 + mocha + karma 重复测试

Tests repeat with angular4 + mocha + karma

Question/Issue

我已经将 angular-cli 1.0.0 生成的基本项目从使用 jasmine 转换为使用 mocha。 为什么当我完成到 mocha 的转换时,所有的测试 运行 都做两次? 有趣的是当我们 运行 与 wallabyjs tests/code 相同 运行ner,或者用降级的angular2,那么只测试运行一次。

为了从头开始重现,我采取了 3 个步骤和可选的第 4 个步骤。不幸的是,涉及到很多代码,所以我提供了一个存储库来演示,并提供了一个命令来执行每个步骤,可以在步骤详细信息中找到。

第 1 步使用 angular-cli 创建项目

详情

第 2 步验证 jasmine 在本地和 CI

上使用 karma 和 wallaby 测试 运行

详情

第 3 步介绍 mocha 并将规范从 jasmine 转换为 mocha

详情

可选观察

我观察到的最奇怪的事情之一是使用 angular 2 没有相同的行为!

第 4 步将 angular 从 4 降级为 2

步骤详细信息

karma 的框架配置是问题

因为 wallabyjs 按预期工作,我花了很多时间探索 karma 和 karma-mocha,重点放在 karma.conf.js

坏了karma.conf.js

// Karma configuration file, see link for more information
// https://karma-runner.github.io/0.13/config/configuration-file.html

module.exports = function (config) {
  config.set({
    basePath: '',
    frameworks: ['mocha', 'chai', 'sinon-chai', '@angular/cli'],
    plugins: [
      require('karma-mocha'),
      require('karma-chai'),
      require('karma-sinon'),
      require('karma-sinon-chai'),
      require('karma-chrome-launcher'),
      require('karma-phantomjs-launcher'),
      require('karma-mocha-reporter'),
      require('karma-coverage-istanbul-reporter'),
      require('karma-istanbul-threshold'),
      require('@angular/cli/plugins/karma')
    ],
    client:{
      clearContext: false // leave Jasmine Spec Runner output visible in browser
    },
    files: [
      { pattern: 'node_modules/sinon/pkg/sinon.js', instrument: false },
      { pattern: 'node_modules/chai/chai.js', instrument: false },
      { pattern: 'node_modules/sinon-chai/lib/sinon-chai.js', instrument: false },
      { pattern: './src/test.ts', watched: false }
    ],
    preprocessors: {
      './src/test.ts': ['@angular/cli']
    },
    mime: {
      'text/x-typescript': ['ts','tsx']
    },
    coverageIstanbulReporter: {
      reports: [ 'html', 'lcovonly', 'json' ],
      fixWebpackSourcePaths: true
    },
    istanbulThresholdReporter: {
      src: 'coverage/coverage-final.json',
      reporters: ['text'],
      thresholds: {
        global: {
          statements: 95.01,
          branches: 75.59,
          lines: 91.89,
          functions: 89.23
        },
        each: {
          statements: 75.76,
          branches: 33.33,
          lines: 75,
          functions: 41.67
        }
      }
    },
    angularCli: {
      environment: 'dev'
    },
    reporters: config.angularCli && config.angularCli.codeCoverage
              ? ['progress', 'coverage-istanbul', 'istanbul-threshold']
              : ['progress', 'mocha'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['Chrome'],
    singleRun: false
  });
};

我采用的方法是 "try stuff until it works" 的最佳实践,这意味着我逐行删除部分配置以查看它是否重要并查看它是否改变了行为。

分辨率

具体来说,修复是从 frameworks 数组中删除 sinon-chai 和可选的 chai

frameworks: ['mocha', 'chai', 'sinon-chai', '@angular/cli'],

变成

frameworks: ['mocha', '@angular/cli'],

资源

工作代码可以在 this commit with this diff 使用 angular-cli / karma / mocha / angular4

找到

Travis 构建结果

Chromium 53.0.2785 (Ubuntu 0.0.0): Executed 0 of 3 SUCCESS (0 secs / 0 secs)
Chromium 53.0.2785 (Ubuntu 0.0.0): Executed 1 of 3 SUCCESS (0 secs / 0.062 secs)
Chromium 53.0.2785 (Ubuntu 0.0.0): Executed 2 of 3 SUCCESS (0 secs / 0.079 secs)
Chromium 53.0.2785 (Ubuntu 0.0.0): Executed 3 of 3 SUCCESS (0 secs / 0.086 secs)
Chromium 53.0.2785 (Ubuntu 0.0.0): Executed 3 of 3 SUCCESS (0.32 secs / 0.086 secs)