Karma 测试在 chrome 中失败,但在 phantomjs 中通过

Karma tests fail in chrome but pass in phantomjs

我已经为此苦苦挣扎了一段时间,似乎找不到正确的解决方案,

我正在 运行 一个使用 angular 2 测试环境的 ionic 2 项目,当我 运行 使用 karmas chrome 启动器进行 ng 测试时,我得到以下错误:

开始:

07 12 2016 11:20:50.590:INFO [karma]: Karma v1.2.0 服务器启动于 http://localhost:8888/ 07 12 2016 11:20:50.591:INFO [launcher]: 以无限并发启动浏览器 Chrome 07 12 2016 11:20:50.682:信息 [启动器]:启动浏览器 Chrome 07 12 2016 11:20:52.993:INFO [Chrome 55.0.2883 (Linux 0.0.0)]: 已连接到 socket /#wi3gg8nwMc27F0H4AAAA,ID 为 3728337

在 0.002 秒/0 秒内完成

总结: ✔ 0 个测试已完成

但是当使用 PhantomJS 时所有测试 运行 完美。

我的系统 运行ning 是:

我已经尝试重新安装所有模块,我已经重新安装了 OS,我已经在另一个 linux 系统上安装了项目并且它在相同的环境下完美运行

我的karma.conf.js文件如下


    module.exports = 功能(配置){
        config.set({
            basePath: '../',
            框架:['jasmine', 'angular-cli'],
            插件:[
                要求('karma-jasmine'),
                要求('karma-chrome-launcher'),
                要求('karma-phantomjs-launcher'),
                要求('karma-remap-istanbul'),
                要求('karma-mocha-reporter'),
                要求('angular-cli/plugins/karma')
            ],
            文件:[
                { pattern: './src/test.ts', watched: false }
            ],
            预处理器:{
                './src/test.ts': ['angular-cli']
            },
            重新映射伊斯坦布尔记者:{
                报告:{
                    html: 'coverage',
                    lcovonly:'coverage/coverage.lcov'
                }
            },
            angular客户端:{
                配置:'./angular-cli.json',
                环境:'dev'
            },
            记者:【
                'mocha'、'karma-remap-istanbul'
            ],
            自定义启动器:{
                Chrome_travis_ci:{
                    基地:'Chrome',
                    标志:['--no-sandbox']
                }
            },
            端口:8888,
            颜色:真实,
            日志级别:config.LOG_INFO,
            自动手表:真,
            浏览器无活动超时:40000,
            浏览器:['Chrome'],
            单次运行:假
        });
    };

我的test.ts文件如下:


    导入'./polyfills.ts';

    导入 'zone.js/dist/long-stack-trace-zone';
    导入 'zone.js/dist/proxy.js';
    导入 'zone.js/dist/sync-test';
    导入 'zone.js/dist/jasmine-patch';
    导入 'zone.js/dist/async-test';
    导入 'zone.js/dist/fake-async-test';

    从'@angular/core/testing'导入{TestBed};
    从 '@angular/forms' 导入 { FormsModule, ReactiveFormsModule };
    从 'ionic-angular' 导入 { App、Config、Form、IonicModule、Keyboard、MenuController、NavController、Platform };

    从'./test/mock'导入{ConfigMock};

    // 不幸的是,`__karma__` 变量没有输入。只需将其声明为任何即可。
    声明 var __karma__: any;
    声明 var require: any;

    // 防止 Karma 过早 运行ning。
    __karma__.loaded = (): any => { /* 无操作 */};

    Promise.all([
        System.import('@angular/core/testing'),
        System.import('@angular/platform-browser-dynamic/testing'),
    ])
    // 首先,初始化 Angular 测试环境。
        .then(([testing, testingBrowser]) => {
            testing.getTestBed().initTestEnvironment(
                testingBrowser.BrowserDynamicTestingModule,
                testingBrowser.platformBrowserDynamicTesting()
            );
        })
        // 然后我们找到所有的测试。
        .then(() => require.context('./', true, /\.spec\.ts/))
        // 并加载模块。
        .then(context => context.keys().map(context))
        // 最后,启动 Karma 以进行 运行 测试。
        .then(__karma__.start, __karma__.error);

    导出 class TestUtils {

        public static beforeEachCompiler(components: Array): Promise {
            return TestUtils.configureIonicTestingModule(组件)
                .compileComponents().then(() => {
                    让 fixture: any = TestBed.createComponent(components[0]);
                    return{
                        固定装置,
                        实例:fixture.debugElement.componentInstance,
                    };
                });
        }

        public static configureIonicTestingModule(components: Array): typeof TestBed {
            return TestBed.configureTestingModule({
                声明:[
                    ...成分,
                ],
                进口:[
                    表单模块,
                    离子模块,
                    反应形式模块,
                ],
                供应商:[
                    {provide: App, useClass: ConfigMock},
                    {提供:配置,使用类:ConfigMock},
                    形式,
                    {提供:键盘,useClass:ConfigMock},
                    {提供:MenuController,useClass:ConfigMock},
                    {provide: NavController, useClass: ConfigMock},
                    {提供:平台,使用类:ConfigMock},
                    {提供:配置,使用类:ConfigMock},
                ],
            });
        }

        // 
        public static eventFire(el: any, etype: string): void {
            如果(el.fireEvent){
                el.fireEvent('on' + etype);
            } 别的 {
                让 evObj: any = document.createEvent('Events');
                evObj.initEvent(etype, true, false);
                el.dispatchEvent(evObj);
            }
        }
    }

如有任何帮助或指导,我们将不胜感激

所以我找到了答案,如果有人有同样的问题,我的 Chrome 浏览器似乎更新到版本 55.0.2883.75(64 位),这导致 Angular 2 出现错误我正在编码的 Typescript 应用程序,我通过添加

解决了这个问题
mime: {
    'text/x-typescript': ['ts','tsx']
},

到我的 karma.conf.js 文件。