2016-04-07 2 views
2

Я уже много дней борюсь за то, что я не могу запустить настоящий тест с кармой. Я могу запустить тесты, которые не требуют импорта (как базовые тесты здравомыслие), но как только я должен импортировать что-то из моего приложения я получаю ошибку:Карма не может загружать импортированные файлы

system.src.js:1085 GET http://localhost:9876/base/dist/components/test.service 404 (Not Found)fetchTextFromURL @ system.src.js:1085(anonymous function) @ system.src.js:1646ZoneAwarePromise @ angular2-polyfills.js:589(anonymous function) @ system.src.js:1645(anonymous function) @ system.src.js:2667(anonymous function) @ system.src.js:3239(anonymous function) @ system.src.js:3506(anonymous function) @ system.src.js:3888(anonymous function) @ system.src.js:4347(anonymous function) @ system.src.js:4599(anonymous function) @ system.src.js:337ZoneDelegate.invoke @ angular2-polyfills.js:332Zone.run @ angular2-polyfills.js:227(anonymous function) @ angular2-polyfills.js:576ZoneDelegate.invokeTask @ angular2-polyfills.js:365Zone.runTask @ angular2-polyfills.js:263drainMicroTaskQueue @ angular2-polyfills.js:482ZoneTask.invoke @ angular2-polyfills.js:434 angular2-polyfills.js:469 Unhandled Promise rejection: karma.error is not a function ; Zone: ; Task: Promise.then ; Value: TypeError: karma.error is not a function(…)consoleError @ angular2-polyfills.js:469drainMicroTaskQueue @ angular2-polyfills.js:498ZoneTask.invoke @ angular2-polyfills.js:434 angular2-polyfills.js:471 Error: Uncaught (in promise): TypeError: karma.error is not a function(…)

мне нужно упомянуть: Пример теста:

import { provide } from 'angular2/core'; 
import {TestService} from './test.service'; 
import { 
// beforeEach, 
    beforeEachProviders, 
    describe, 
    expect, 
    it, 
    inject, 
// injectAsync 
} from 'angular2/testing'; 

describe('TestService',() => { 

    beforeEachProviders(() => [ 
    provide(TestService, {useClass: TestService}) 
    ]); 
    it('should say hello with name', inject([TestService], (testService: TestService) => { 
    expect(testService.name).toBe('Injected Service'); 
    })); 

    it('should say hello with name',() => { 
    expect(true).toBe(true); 
    }); 

}); 

Моя структура проекта многоместный модуль на основе, как:

enter image description here

Karma.conf.js:

frameworks: ['jasmine'], 

files: [ 
    // paths loaded by Karma 
    { pattern: 'node_modules/angular2/bundles/angular2-polyfills.js', included: true, watched: true }, 
    { pattern: 'node_modules/systemjs/dist/system.src.js', included: true, watched: true }, 
    { pattern: 'node_modules/rxjs/bundles/rx.js', included: true, watched: true }, 
    { pattern: 'node_modules/angular2/bundles/angular2.js', included: true, watched: true }, 
    { pattern: 'node_modules/angular2/bundles/testing.dev.js', included: true, watched: true }, 
    { pattern: 'karma-test-shim.js', included: true, watched: true }, 
    { pattern: 'dist/components/matchers.js', included: true, watched: true }, 

    // paths loaded via module imports 
    { pattern: 'dist/components/**/*.js', included: false, watched: true }, 

    // paths loaded via Angular's component compiler 
    // (these paths need to be rewritten, see proxies section) 
    { pattern: 'dist/*.html', included: false, watched: true }, 
    { pattern: 'dist/styles/*.css', included: false, watched: true }, 
    { pattern: 'dist/components/**/*.html', included: false, watched: true }, 
    { pattern: 'dist/components/**/*.css', included: false, watched: true }, 

    // paths to support debugging with source maps in dev tools 
    { pattern: 'src/components/**/*.ts', included: false, watched: false }, 
    { pattern: 'dist/components/**/*.js.map', included: false, watched: false } 
], 

// proxied base paths 
proxies: { 
    // required for component assests fetched by Angular's compiler 
    "/src/": "/base/src" 
}, 

карма-тест-shim.js:

... 

System.config({ 
    packages: { 
     'base/src': { 
      defaultExtension: false, 
      format: 'register', 
      map: Object.keys(window.__karma__.files). 
       filter(onlyAppFiles). 
       reduce(function createPathRecords(pathsMapping, appPath) { 
        // creates local module name mapping to global path with karma's fingerprint in path, e.g.: 
        // './hero.service': '/base/src/app/hero.service.js?f4523daf879cfb7310ef6242682ccf10b2041b3e' 
        var moduleName = appPath.replace(/^\/base\/src\//, './').replace(/\.js$/, ''); 
        pathsMapping[moduleName] = appPath + '?' + window.__karma__.files[appPath] 
        return pathsMapping; 
       }, {}) 

     } 
    } 
}); 


function filePath2moduleName(filePath) { 
    console.log('filePath2moduleName', filePath) 
    return filePath. 
     replace(/^\//, '').    // remove/prefix 
     replace(/\.\w+$/, '');   // remove suffix 
} 


function onlyAppFiles(filePath) { 
    console.log('filePath', filePath) 
    return /^\/base\/src\/.*\.js$/.test(filePath) 
} 


function onlySpecFiles(path) { 
    return /.spec\.js$/.test(path); 
} 

Любая идея очень приветствуется!

+0

И ваши TS файлы компилируются в 'dist' папку? Правильно? –

ответ

1

Если вы скомпилируете свои файлы TS в папку dist, я думаю, что у вас есть пробел. Я хотел бы попробовать следующее в файле karma-test-shim.js:

System.config({ 
    packages: { 
    'base/dist': { 
     defaultExtension: false, 
     format: 'cjs', 
     map: Object.keys(window.__karma__.files).filter(onlyAppFiles).reduce(createPathRecords, {}) 
    } 
    } 
}); 

(...) 

function createPathRecords(pathsMapping, appPath) { 
    var pathParts = appPath.split('/'); 
    var moduleName = './' + pathParts.slice(Math.max(pathParts.length - 2, 1)).join('/'); 
    moduleName = moduleName.replace(/\.js$/, ''); 
    pathsMapping[moduleName] = appPath + '?' + window.__karma__.files[appPath]; 
    return pathsMapping; 
} 

Следующая строка в вашем createPathRecords функции кажется странным, так как вы не должны иметь файлы src но из dist.

С помощью этого кода я следующая конфигурация SystemJS генерируется (map блок):

System.config({ 
    packages: { 
    'base/dist': { 
     defaultExtension: false, 
     format: 'register', 
     map: { 
     './comps/my-list': '/base/dist/comps/my-list.js?e9(...)', 
     './dist/my-app': '/base/dist/my-app.js?fe(...)', 
     './pipes/my-pipe': '/base/dist/pipes/my-pipe.js?78(...)', 
     './services/http-service': '/base/dist/services/http-service.js?c1(...)', 
     './services/my-service': '/base/dist/services/my-service.js?b1(...)' 
     } 
    } 
    } 
}); 

В вашем случае /base/dist/components/test.service не может быть решена SystemJS, поэтому я думаю, что либо ваш map блок не является правильным или запись для packages.

Обратите внимание, что запись блока map относится к ключу packages. В вашем случае, я думаю, что вы создаете следующую конфигурацию:

System.config({ 
    packages: { 
    'base/src': { 
     defaultExtension: false, 
     format: 'register', 
     map: { 
     './components/test.service': '/base/dist/components/test.service.js', 
     (...) 
     } 
    } 
    } 
}); 

Так отлаживать вашу проблему, я хотел бы сделать следующее:

  • Протоколирование appPath в вашей createPathRecords функции:

    KG
    reduce(function createPathRecords(pathsMapping, appPath) { 
        console.log('appPath = '+appPath); 
        (...) 
    } 
    
  • Законодательство: map:

    console.log(Object.keys(window.__karma__.files).filter(onlyAppFiles).reduce(createPathRecords, {})); 
    

Основываясь на этих намеков, вы должны адаптировать свой код, чтобы иметь такую ​​конфигурацию:

{ 
    './components/test.service': '/base/dist/components/test.service.js', 
    (...) 
} 
+0

Я начал регистрировать пути. Во-первых: одна из проблем заключается в том, что я никогда не достигаю createPathRecords(), потому что мой код падает где-то до этого.Я добавил другие методы, вызванные в shim.js. Я заменяю «src» на «dist», все еще получаю ошибку, но по крайней мере теперь пути для импортированных файлов в порядке ... –

+1

Я, наконец, исправил это! Спасибо Тьерри! Проблема (как вы думали) заключалась в том, что где-то в karma.test.shim.js был src вместо «dist». Это место для меня было только вAppFiles(). Нет ошибок кармы. –

Смежные вопросы