Angular 1.x, ES5 / ES6 и тестирование с Karma

0

У меня есть угловое приложение (с набором файлов ES5 и ES6), для которого я разрабатываю тесты. Файлы ES6, которые я транслирую с помощью Babel CLI с этими параметрами --modules system --module-ids. Пусть говорят, что у меня есть что-то вроде этого:

Файл 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) и загружаю угловое приложение:

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() {

    });
});

Есть лучший способ сделать это?

Теги:
karma-runner
es6-module-loader

1 ответ

0
Лучший ответ

Решение, в котором я попал, включало использование карма-системы.

Включите все ваши файлы тестов в разделе 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() {

    });
});

Надеюсь, это поможет кому-то еще в будущем.

  • 0
    Я работаю над аналогичной настройкой, но, кажется, Карма не загружает файлы в массив файлов, независимо от того, использую minimatch patterns или нет. Кроме того, мой karma.config.js очень похож на ваш.
  • 0
    systemjs: { // Path to your SystemJS configuration file configFile: 'test/unit/system-test.config.js', files: [ 'test/unit/modules/security/security.spec.js' ], // includeFiles: [ // 'dist/js/libs.js', // 'dist/js/app.js', // 'dist/js/app.typescript.js', // 'test/unit/old_js/**/*.spec.js' // ], config: { paths: { 'angular-mocks': 'bower_components/angular-mocks/angular-mocks.js' } } }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню