简体   繁体   English

Angular 2 + Karma + karma-jspm + karma-coverage +打字稿报告phantomJS失败

[英]Angular 2 + Karma + karma-jspm + karma-coverage + typescript report phantomJS failure

I've been fighting the last few days with getting coverage reports working and I've hit an issue I haven't been able to resolve. 最近几天,我一直在努力争取覆盖率报告,但遇到了一个我无法解决的问题。 The stack trace I'm receiving, with a couple of lines of surrounding debug code, is 我收到的堆栈跟踪以及两行周围的调试代码是

15 07 2016 14:41:53.413:DEBUG [middleware:source-files]: Requesting /jspm_packages/npm/process@0.11.5/browser.js /
15 07 2016 14:41:53.413:DEBUG [middleware:source-files]: Fetching /jspm_packages/npm/process@0.11.5/browser.js
15 07 2016 14:41:53.415:DEBUG [proxy]: proxying request - /jspm_packages/npm/process@0.11.5/browser.js to localhost:9876
15 07 2016 14:41:53.417:DEBUG [middleware:source-files]: Requesting /base/jspm_packages/npm/process@0.11.5/browser.js /
15 07 2016 14:41:53.417:DEBUG [middleware:source-files]: Fetching /home/administrator/assist-2.0/client/jspm_packages/npm/process@0.11.5/browser.js
15 07 2016 14:41:53.419:DEBUG [web-server]: serving: /home/administrator/assist-2.0/client/jspm_packages/npm/process@0.11.5/browser.js
PhantomJS 2.1.1 (Linux 0.0.0) ERROR
  Error: (SystemJS) /home/administrator/assist-2.0/client/jspm_packages/system.src.js:3047:137
        /home/administrator/assist-2.0/client/jspm_packages/system.src.js:3756:33
        /home/administrator/assist-2.0/client/jspm_packages/system.src.js:4251:37
        /home/administrator/assist-2.0/client/jspm_packages/system.src.js:1508:27
        /home/administrator/assist-2.0/client/jspm_packages/system.src.js:2738:28
        register@/home/administrator/assist-2.0/client/jspm_packages/system.src.js:2998:23
        eval code
        eval@[native code]
        __exec@/home/administrator/assist-2.0/client/jspm_packages/system.src.js:1544:18
        execute@/home/administrator/assist-2.0/client/jspm_packages/system.src.js:3723:20
        linkDynamicModule@/home/administrator/assist-2.0/client/jspm_packages/system.src.js:3281:36
        link@/home/administrator/assist-2.0/client/jspm_packages/system.src.js:3124:28
        execute@/home/administrator/assist-2.0/client/jspm_packages/system.src.js:3491:17
        doDynamicExecute@/home/administrator/assist-2.0/client/jspm_packages/system.src.js:774:32
        link@/home/administrator/assist-2.0/client/jspm_packages/system.src.js:972:36
        doLink@/home/administrator/assist-2.0/client/jspm_packages/system.src.js:631:11
        updateLinkSetOnLoad@/home/administrator/assist-2.0/client/jspm_packages/system.src.js:677:24
        /home/administrator/assist-2.0/client/jspm_packages/system.src.js:493:30
        invoke@/home/administrator/assist-2.0/client/node_modules/zone.js/dist/zone.js:323:34
        runGuarded@/home/administrator/assist-2.0/client/node_modules/zone.js/dist/zone.js:230:54
        /home/administrator/assist-2.0/client/node_modules/zone.js/dist/zone.js:206:40
        Evaluating http://localhost:9876/dist/src/components/widgets/nested-table/nested-table.component.js
        Error loading http://localhost:9876/dist/tests/unit/components/nested-table.spec.js
PhantomJS 2.1.1 (Linux 0.0.0): Executed 0 of 0 ERROR (1.095 secs / 0 secs)
15 07 2016 14:41:53.436:DEBUG [karma]: Run complete, exiting.
15 07 2016 14:41:53.437:DEBUG [launcher]: Disconnecting all browsers
15 07 2016 14:41:53.441:DEBUG [launcher]: Process PhantomJS2 exited with code 0
15 07 2016 14:41:53.442:DEBUG [temp-dir]: Cleaning temp dir /tmp/karma-88547336
15 07 2016 14:41:53.449:DEBUG [launcher]: Finished all browsers

karma.conf.js karma.conf.js

module.exports = function(config) {
    config.set({
        frameworks: ['jspm', 'jasmine'],

        basePath: '.',

        files: [
            'node_modules/zone.js/dist/zone.js',
            'node_modules/zone.js/dist/jasmine-patch.js',
            'node_modules/reflect-metadata/Reflect.js',
            'node_modules/es6-shim/es6-shim.js',
            'jspm_packages/system-polyfills.js'
        ],

        jspm: {
            loadFiles: [
                'dist/tests/**/*.js',
            ],

            serveFiles: [
                'dist/src/**/*.js',
                // 'src/**/*.ts'
            ]
        },

        proxies: {
            // '/src/': '/base/src/',
            '/dist/src/': '/base/dist/src/',
            '/dist/tests/': '/base/dist/tests/',
            '/jspm_packages/': '/base/jspm_packages/',
        },

        port: 9876,
        logLevel: config.LOG_INFO,
        colors: true,
        autoWatch: true,
        browsers: [
            // 'PhantomJS',
            'PhantomJS2',

        ],

        plugins: [
            'karma-jasmine',
            'karma-jspm',
            'karma-phantomjs-launcher',
            'karma-phantomjs2-launcher',
            'karma-junit-reporter',
            'karma-coverage',
            'karma-sourcemap-loader',
            // 'karma-typescript-preprocessor'
        ],

        reporters: [
            'coverage',
            'junit',
            'dots',
        ],

        junitReporter: {
            outputDir: '.',
            outputFile: "./reports/client-test-results.xml",
            useBrowserName: false
        },

        preprocessors: {
            'dist/src/**/!(*.spec).js!(.map)': [
                'sourcemap',
                // 'typescript',
                'coverage'
            ],
            // 'src/**/*.ts': [
            //     'sourcemap',
            //     'typescript',
            //     'coverage',
            // ],
        },

        coverageReporter: {
            dir: 'reports',
            subdir: 'coverage',
            includeAllSources: true,
            reporters: [
                {
                    type: 'json',
                    file: 'coverage.json'
                },
                // {
                //     type: 'cobertura',
                //     file: 'coverage.xml'
                // },
                // {
                //     type: 'html',
                //     subdir: 'coverage/html'
                // }
            ],
            instrumenterOptions: {
                istanbul: {
                    noCompact: true
                }
            }
        },

        // typescriptPreprocessor: {
        //     options: {
        //         inlineSourceMap: true,
        //         inlineSources: true,
        //         "target": "es5",
        //         "module": "system",
        //         "sourceMap": true,
        //         "emitDecoratorMetadata": true,
        //         "experimentalDecorators": true,
        //         "removeComments": false,
        //         "noImplicitAny": false,
        //     },
        //     transformPath: function(path) {
        //         return path.replace(/\.ts$/, '.js');
        //     }
        // },

        singleRun: true
    })
};

nested-table.spec.ts 嵌套table.spec.ts

import {NestedTableComponent} from '../../../src/components/widgets/nested-table/nested-table.component';
import {beforeEach, describe, expect, it} from '@angular/core/testing';
import {DEBUG_VIEW_TEST_DATA, DEBUG_VIEW_TEST_HEADERS} from '../../../src/db/mockdata';
import { ImmutableMatchers } from '../helpers/jasmine-immutable-matchers';

describe('Nested Table Component', () => {
    let ntable, data, headers;
    beforeEach(function() {
        jasmine.addMatchers(ImmutableMatchers);
        ntable = new NestedTableComponent();
        data = DEBUG_VIEW_TEST_DATA[0].data;
        headers = DEBUG_VIEW_TEST_HEADERS[0].headers;
    });

    it('should return an array of keys', () => {
        expect(ntable.keys(data)).toEqualImmutable(data.keySeq());
    });

    it('should calculate the widths of columns', () => {
        let expected = {
            "Element Property": 4,
            "Key": 2,
            "Property Value": 2,
            "Last Refresh": 2,
            "Element Definition": 2
        }
        expect(ntable.getColWidths(headers)).toEqual(expected);
    });
});

When I change the preprocessors to 当我将预处理器更改为

preprocessors: {
    'dist/src/!(*.spec).js!(.map)': [
        'sourcemap',
        // 'typescript',
        'coverage'
    ],
    // 'src/**/*.ts': [
    //     'sourcemap',
    //     'typescript',
    //     'coverage',
    // ],
},

I don't receive the stack trace, and it gives me coverage, but obviously not on my other components and such. 我没有收到堆栈跟踪,它没有覆盖任何内容,但是显然没有包含在我的其他组件上。 This appears to be a problem with SystemJS module loading, but I can not figure out what's going on, or if that's even the actual problem. 这似乎是SystemJS模块加载的问题,但是我无法弄清楚到底是怎么回事,或者这甚至不是实际的问题。

The tests pass fine when I remove coverage from the reporter list. 当我从报告者列表中删除覆盖率时,测试通过顺利。

I also attempted to use karma-typescript-preprocessor (refer to the commented out bits of code in karma.conf.js), and I was getting a coverage report, but the sourcemap files would not map correctly, which I also could not figure out. 我还尝试使用karma-typescript-preprocessor(请参阅karma.conf.js中注释掉的代码位),并且得到了覆盖率报告,但是sourcemap文件无法正确映射,因此我也无法找到出。

Has anyone experienced anything similar and found a way to overcome the issue? 有没有人经历过类似的事情并找到了解决问题的方法?

I wish I can answer your question directly, but I too struggled to get a project running that has code coverage. 我希望我可以直接回答您的问题,但是我也很难使一个运行的项目具有代码覆盖率。 I finally broke down and refactored karma-jspm to explicitly includes code coverage. 最后,我分解并重构了karma-jspm以明确包括代码覆盖范围。

To see a sample, I created a seed project incorporating all the libraries in your question. 为了查看示例,我创建了一个种子项目,其中包含了您问题中的所有库。 The key component is that SystemJS is utilized for development, production, unit tests, e2e tests, and code coverage. 关键组件是SystemJS用于开发,生产,单元测试,端到端测试和代码覆盖率。

See angular2-jspm-typescript-seed 参见angular2-jspm-typescript-seed

This project is using @uiuxengineering/karma-jspm instead of the original karma-jspm to support SystemJS code coverage and angular2. 该项目使用@ uiuxengineering / karma-jspm而不是原始的karma-jspm来支持SystemJS代码覆盖率和angular2。

The Karma Config looks like this: 业力配置如下所示:

// Karma configuration
    // Generated on Wed Jul 15 2015 09:44:02 GMT+0200 (Romance Daylight Time)
    'use strict';

    var argv = require('yargs').argv;

    module.exports = function(config) {
      config.set({

        // base path that will be used to resolve all patterns (eg. files, exclude)
        basePath: './src/client',

        // frameworks to use
        // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
        frameworks: ['jspm', 'jasmine'],

        // list of files / patterns to load in the browser
        jspm: {
          stripExtension: false,

          /**
           * main config
           */
          config: 'jspm.config.js',

          /**
           * dev jspm config.
           */
          dev: null,

          /**
           * node jspm config
           */
          node: null,

          /**
           * browser jspm config.
           */
          browser: null,

          packages: 'jspm_packages',

          /**
           * Adapters do any preloading with systemJs before tests start,
           * and impletent the karma.start method.
           *
           * 'angular2' is the only option for now.
           * If not defined, a default adapter is used.
           *
           * @param path to adapter or 'angular2'
           */
          adapter: 'angular2',


          /**
           * Files loaded by system js before app is loaded.
           * They will load in same order provided.
           *
           * Default files are set for 'angular2' adapter.
           * This property will override defaults if set.
           */
          // preloadBySystemJS: [
          //   'zone.js/dist/zone.js',
          //   '@angular/core/testing',
          //   '@angular/platform-browser-dynamic/testing',
          //   'zone.js/dist/jasmine-patch.js',
          //   'zone.js/dist/async-test.js',
          //   'zone.js/dist/fake-async-test.js'
          // ],

          /**
           * Files may be provided in a object to
           * configure specific serve options.
           *
           * Files will be put in an object similar to:
           *
           * {
           *    pattern: 'someFile.js,
           *    included: false,  // configurable
           *    served: true,     // configurable
           *    nocache: false,   // configurable
           *    watched: true     // configurable
           * };
           *
           * All options configured if provided in an object.
           *
           */
          loadFiles: [
            'app/**/*.spec.ts',
            'testing/**/*.ts'
          ],

          /**
           * Files will be put in an object EXACTLY with the options:
           *
           * {
           *    pattern: 'someFile.js,
           *    included: false,
           *    served: true,
           *    nocache: false,
           *    watched: true
           * };
           */
          serveFiles: [
            'app/**/*!(*.spec|*.e2e-spec).ts',
            'app/**/*.html',
            'app/**/*.scss',
            'assets/**/*.json'
          ]
        },

        // must go along with above, suppress annoying 404 warnings.
        proxies: {
          '/app/': '/base/app/',
          '/assets/': '/base/assets/',
          '/jspm_packages/': '/base/jspm_packages/',
          '/scss/': '/base/scss/',
          '/testing/': '/base/testing/'
        },

        // list of files to exclude
        exclude: [],


        // preprocess matching files before serving them to the browser
        // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
        preprocessors: {
          'app/**/!(*.spec).ts': ['jspm']
        },

        // test results reporter to use
        // possible values: 'dots', 'progress'
        // available reporters: https://npmjs.org/browse/keyword/karma-reporter
        // reporters: ['junit', 'coverage', 'spec'],
        reporters: ['mocha', 'jspm'],

        coverageReporter: {

          // map coverage to source typescript or es6 files.
          remap: true,

          dir: process.cwd() + '/test-reports/unit',

          subdir: function(directory) {
            return directory.replace(/\s/g, '_');
          },

          reporters: [

            // will generate html report
            {type: 'html'},

            // will generate json report file and this report is loaded to
            // make sure failed coverage cause gulp to exit non-zero
            {type: 'json', file: 'coverage-final.json'},

            // will generate Icov report file and this report is published to coveralls
            {type: 'lcov'},

            // it does not generate any file but it will print coverage to console
            // a summary of the coverage
            // {type: 'text-summary'},

            // it does not generate any file but it will print coverage to console
            // a detail report of every file
            {type: 'text'}
          ]
        },

        // web server port
        port: 9876,


        // enable / disable colors in the output (reporters and logs)
        colors: true,


        // level of logging
        // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
        logLevel: config.LOG_DEBUG,

        loggers: [{
          "type": "file",
          "filename": "./log_file.log",
          "maxLogSize": 20480,
          "backups": 3,
          "category": "absolute-logger"
        }],

        // enable / disable watching file and executing tests whenever any file changes
        autoWatch: true,


        // start these browsers
        // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
        browsers: [
          'Chrome'
        ],

        plugins: [
          require('@uiuxengineering/karma-jspm'),
          'karma-jasmine',
          'karma-chrome-launcher',
          'karma-mocha-reporter',
          'karma-ie-launcher',
          'karma-phantomjs-launcher'
        ],

        customLaunchers: {
          Chrome_travis_ci: {
            base: 'Chrome',
            flags: ['--no-sandbox']
          }
        },

        // Continuous Integration mode
        // if true, Karma captures browsers, runs the tests and exits
        singleRun: false,

        // Passing command line arguments to tests
        client: {
          files: argv.files
        }
      });

      if (process.env.APPVEYOR) {
        config.browsers = ['IE'];
        config.singleRun = true;
        config.browserNoActivityTimeout = 90000; // Note: default value (10000) is not enough
      }

      if (process.env.TRAVIS || process.env.CIRCLECI) {
        config.browsers = ['Chrome_travis_ci'];
        config.singleRun = true;
      }
    };

The Karma config is designed to run in WebStorm as well with the gulp task "test". Karma配置旨在与gulp任务“ test”一起在WebStorm中运行。

I'm also struggling with a working setup for karma, systemjs and typescript. 我还在为业力,systemjs和打字稿的有效设置而苦苦挣扎。 I found a working setup but it's a bit ugly and depends on remaping the coverage report through gulp, because the karma plugin for remaping doesn't work correctly inside karma but only in gulp. 我找到了一个有效的设置,但它有点丑陋,并且依赖于通过gulp重新映射覆​​盖率报告,因为用于重新映射的业力插件在业力内部无法正常工作,而只能在gulp中工作。 I used the systemjs plugin instead of the jspm plugin, as it seams to work better. 我使用systemjs插件而不是jspm插件,因为它看起来更好用。

// Karma configuration
// Generated on Sat Aug 13 2016 18:33:27 GMT+0200 (CEST)

module.exports = function (config) {
config.set({

    // base path that will be used to resolve all patterns (eg. files, exclude)
    basePath: './',


    // frameworks to use
    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
    frameworks: ['systemjs', 'jasmine'],


    // list of files / patterns to load in the browser
    files: [

        'node_modules/core-js/client/shim.min.js',
        'node_modules/reflect-metadata/Reflect.js',
        'node_modules/zone.js/dist/zone.js',

//      {pattern: 'node_modules/systemjs/dist/system.src.js', included: false, watched: false},
//      {pattern: 'jspm_packages/**/*.js', included: false, watched: false},

        {pattern: 'jspm_packages/npm/@angular/**/*.js', included: false, watched: false},
        {pattern: 'jspm_packages/npm/rxjs@5.0.0-beta.10/**/*.js', included: false, watched: false},
        'jspm_packages/npm/lodash@4.13.1/lodash.js',
        'jspm_packages/npm/angular2-swiper@0.4.0/dist/ks-swiper.js',
        'jspm_packages/npm/swiper@3.3.1/dist/js/swiper.js',
        'jspm_packages/npm/jquery@2.2.4/dist/jquery.js',
        'jspm_packages/npm/foundation-sites@6.2.3/dist/foundation.js',
        'jspm_packages/npm/symbol-observable@1.0.1/index.js',
        {pattern: 'jspm_packages/npm/symbol-observable@1.0.1/lib/*.js', included: false, watched: false},
        {pattern: 'jspm_packages/npm/rxjs@5.0.0-beta.6/**/*.js', included: false, watched: false},


        {pattern: 'jspm_packages/npm/crypto-js@3.1.6/*.js', included: false, watched: false},
        {pattern: 'jspm_packages/github/**/*.js', included: false, watched: false},
        {pattern: 'jspm_packages/npm/*.js', included: false, watched: false},
        {pattern: 'dev/**/*.js', included: true, watched: true},
        {pattern: 'test/*.spec.js', included: true, watched: true},
        {pattern: 'templates/*.html', included: true, watched: true}
    ],


    // list of files to exclude
    exclude: [],

    proxies: {
//      '/jspm_packages/': '/base/jspm_packages/'
//      '/templates/': '/base/templates/'
    },

    systemjs: {
        configFile: 'dev/systemjs.config.js',
//      serveFiles: ['test/**/*.spec.js'],
        config:     {
            paths: {
//          "github:*": "./jspm_packages/github/*",
//          "npm:*": "./jspm_packages/npm/*"
            },
            map:   {
                'systemjs':          'node_modules/systemjs/dist/system.js',
                'system-polyfills':  'node_modules/systemjs/dist/system-polyfills.js',
                'es6-module-loader': 'node_modules/es6-module-loader/dist/es6-module-loader.js'
            },
            meta:  {
                'dev/app/*': {format: 'register'}
            }
        }
    },

    // preprocess matching files before serving them to the browser
    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
    preprocessors: {
        'dev/app/**/*.js': ['coverage']
    },


    // test results reporter to use
    // possible values: 'dots', 'progress'
    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
//        reporters: ['spec', 'coverage', 'karma-remap-istanbul'],
    reporters: ['spec', 'coverage'],

    coverageReporter: {
        reporters: [{
            type:   'json',
            subdir: '.'
        }, {
            type: 'text-summary'
        }/*, {
            type: 'html'
        }*/]
    },

    /*
    remapIstanbulReporter: {
        src:     'coverage/coverage-final.json',
        reports: {
            html: 'coverage'
        },
        dest:    './coverage-source'
    }, */

    // web server port
    port: 9876,


    // enable / disable colors in the output (reporters and logs)
    colors: true,


    // level of logging
    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
    logLevel: config.LOG_WARN,


    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: true,


    // start these browsers
    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
    browsers: ['PhantomJS', 'Chrome'],


    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    singleRun: false,

    // Concurrency level
    // how many browser should be started simultaneous
    concurrency: Infinity
})
};

This worked for me. 这对我有用。 Additionaly I have this task in my gulpfile 另外,我在gulpfile中有此任务

gulp.task('coverage', ['test'], function () {
return gulp.src('coverage/**/coverage-final.json')
    .pipe(remapIstanbul({
        reports: {
            'json': 'reports/coverage/coverage.json',
            'html': 'reports/coverage/html'
        }
    }))
    .pipe(gulp.dest('reports/coverage/'));
});

This setup still has some issues. 此设置仍然存在一些问题。 For example some empty or not "executed" files may break it, because SystemJS complains about registering and not executing. 例如,一些空文件或未“执行”的文件可能会破坏它,因为SystemJS抱怨注册和未执行。 Test are only included through *.spec.js because using **/*.spec.js doesn't load any tests. 仅通过* .spec.js包含测试,因为使用** / *。spec.js不会加载任何测试。

I already filled a bug report for karma-remap-istanbul plugin. 我已经填写了karma-remap-istanbul插件的错误报告。 https://github.com/marcules/karma-remap-istanbul/issues/21 Maybe there is a chance to get is work inside karma. https://github.com/marcules/karma-remap-istanbul/issues/21也许有机会获得在业力中进行工作的机会。

I Hope that may help to improve your setup and maybe we can even work out a better solution with everything working. 我希望这可能有助于改善您的设置,也许我们甚至可以在一切正常的情况下制定出更好的解决方案。

BTW: I tried to use a setup similar to your's and got the following error, I already have seen a lot of time with jspm and systemjs extension: 顺便说一句:我试图使用类似于您的设置,并收到以下错误,我已经看到很多时间使用jspm和systemjs扩展了:

Module http://localhost:9876/src/common/modules/product/product.js interpreted as global module format, but called System.register. 模块http:// localhost:9876 / src / common / modules / product / product.js解释为全局模块格式,但称为System.register。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM