2016-03-01 7 views
3

Я настраиваю модульные тесты в своем приложении. Мой основной тест спецификации, project.spec.ts, выглядит какИспользование karma-systemjs производит 404 для зависимостей

import {Project} from './project'; 

describe('Project',() => { 
    let p = new Project('New project'); 

    it('should have the name given in the constructor',() => { 
     expect(p.name).toBe('New project'); 
    }); 
}); 

Project это имя класса, который я тестирование, и это определено в файле app/entities/project.ts (т.е. в той же папке).

Однако карма производит 404 ошибку всякий раз, когда тест спецификации пытается импортировать другой файл:

01 03 2016 17:21:04.955:WARN [web-server]: 404: /base/app/entities/project 
Chrome 48.0.2564 (Windows 10 0.0.0) ERROR 
    Error: XHR error (404 Not Found) loading C:/Dev/mps/app/entities/project 
     Error loading C:/Dev/mps/app/entities/project as "./project" from C:/Dev/mps/app/entities/project.spec.js 

Это выглядит как скомпилированный файл project.spec.js загружен правильно, но файл project.js не загружается. Кроме того, я не могу понять, откуда берется префикс /base/ в /base/app/entities/project.

Аналогичный случай описан here. Однако предлагаемое решение не работает для меня. Ни один из приведенных ниже вариантов импорта работы:

let Project = require('./project'); 
let Project = System.import('./project'); // produces "404: /project" instead 
let Project = require('./project.js'); 
let Project = System.import('./project.js'); 

Мои конфиги являются:

karma.conf.js

module.exports = function(config) { 
    config.set({ 
    basePath: '', 
    plugins: ['karma-systemjs', 'karma-jasmine', 'karma-chrome-launcher'], 
    frameworks: ['systemjs', 'jasmine'], 
    systemjs: { 
     configFile: 'system.conf.js' 
    }, 
    files: [ 
     'app/entities/project.spec.js' 
    ], 
    exclude: [ ], 
    preprocessors: { }, 
    reporters: ['progress'], 
    port: 9876, 
    colors: true, 
    logLevel: config.LOG_INFO, 
    autoWatch: true, 
    browsers: ['Chrome'], 
    singleRun: false, 
    concurrency: Infinity 
    }) 
} 

system.conf.js

System.config({ 
    paths: { 
     'traceur': 'node_modules/traceur/bin/traceur.js', 
     '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' 
    } 
}); 

Что я делаю неправильно?

+0

Вы не используете '.js' расширение в процессе импорта поэтому вам нужно либо добавить .js в операторы импорта, либо установить 'defaultJSExtensions: true' в вашем System.config (осторожно, он будет устаревать в будущем). Что касается префикса 'base', он настроен в karma-systemjs https://github.com/rolaveric/karma-systemjs/blob/master/lib/adapter.js#L109. Этот префикс используется, потому что Karma служит для файлов в каталоге/base. –

+0

@FidanHakaj Я добавил 'defaultJSExtensions: true', но это все еще приводит к ошибке 404, хотя и цитирует файл .js:' 404:/base/app/entities/project.js'. Что касается префикса, ссылка, которую вы указали, подразумевает, что я могу переопределить ее, установив «baseURL» в конфигурацию SystemJS? Я попытался добавить 'baseURL' в' system.conf.js' и 'systemjs'' karma.conf.js ', но ничего не изменил. –

ответ

2

Got it. В SystemJS должны быть указаны файлы со ссылками. Это может быть сделано с помощью параметра systemjs.serveFiles в karma.conf.js:

systemjs: { 
    serveFiles: [ 
    'app/entities/project.js' 
    ] 
} 

приятнее способ заключается в использовании шариков настроить этот параметр только один раз:

systemjs: { 
    serveFiles: [ 
    'node_modules/**/*.js', 
    'app/**/*.js' 
    ] 
} 
Смежные вопросы