0

我有一个我正在为其开发测试的角度应用程序(混合了文件 ES5 和 ES6)。我使用 babel CLI 和这些选项 --modules system --module-ids 编译的 ES6 文件。假设我有这样的事情:

ES5 文件:

angular.module('app').controller('A', function($scope) {
    ...
});

ES6 文件:

export class B {
    constructor($scope) {
        this.$scope = $scope 
    }

   ...
}

我有一个名为 boot.js 的文件:

import {B} from 'controllers/B';

angular.module('app').controller('B', B);

在我的页面上,我导入引导文件(使用 es6-module-loader)并引导 Angular 应用程序:

System.import('boot').then(function() {
    angular.bootstrap(document, ['app']);
});

现在,我假设我需要做一些类似于业力测试的事情——我需要在运行测试之前加载我的 boot.js。我解决问题的方法是在我的测试文件中调用 System.impot('boot') - 但似乎不正确:

'use strict';

System.import('boot');

describe('Controller: B', function() {
    beforeEach(module('app'));

    var $scope;

    beforeEach(inject(function(_$rootScope_, $controller) {
        scope = _$rootScope_.$new();

        $controller('B', {$scope: $scope); 
    }));

    it('...', function() {

    });
});

有一个更好的方法吗?

4

1 回答 1

0

我最终找到的解决方案涉及使用karma-systemjs

在 systemjs/files 部分包含所有测试文件:

 systemjs: {
     files: [
         // TEST FILES
     ],

     configFile: 'system.config.js',

     config: {
         paths: {
             'angular-mocks': 'node_modules/angular-mocks/angular-mocks.js'
         }
     }
}

在测试中而不是使用:

System.import('boot');

利用:

'use strict';

import 'angular-mocks';
import 'angular/boot.js';

describe('Controller: B', function() {
    beforeEach(module('app'));

    var $scope;

    beforeEach(inject(function(_$rootScope_, $controller) {
        scope = _$rootScope_.$new();

        $controller('B', {$scope: $scope); 
    }));

    it('...', function() {

    });
});

希望这将有助于将来的其他人。

于 2015-07-05T08:17:22.697 回答