2016-02-15 10 views
9

私は、Angular 2、SystemJS、Karmaをテスト用に使ってWebアプリケーションを構築しています。ノードモジュールにSystemJSとカルマを角2でロードする

私はテストでノードモジュールngrx/storeをロードしようとしている:私は実際にdevに同じ問題を抱えていた

404: /@ngrx/store 
Chrome 48.0.2564 (Mac OS X 10.11.3) ERROR 
    Error: XHR error (404 Not Found) loading http://localhost:9876/@ngrx/store 

import { 
    it, describe, expect, beforeEach, inject 
} from 'angular2/testing'; 

import { Store } from '@ngrx/store'; 

describe('Graphs store',() => { 
    let graphs; 

    beforeEach(inject([Store], (store: Store<any>) => { 
    graphs = store.select('graphs'); 
    })); 

    it('works',() => { 
    // expect graphs to do something... 
    }); 
}); 

は、しかし、私のテストは、次のメッセージで失敗同様に、SystemJSはどこに@ngrx/storeが見つかるのか分からなかった。これを解決するために、私はこれをしなかった:

System.config({ 
    packages: { 
    src: { 
     format: 'register', 
     defaultExtension: 'js' 
    } 
    }, 
    map: { '@ngrx/store' : 'node_modules/@ngrx/store/dist/store.js' } // <-- this 
}); 

私は同じことを行うために私のカルマのシムファイルを変更しました。テストをもう一度実行している時に、私は今、別のエラーが表示されます。これは、考慮に私はそれを与えた明示的なパスを服用しなければならないことを意味

404: /node_modules/@ngrx/store/dist/store.js 
Chrome 48.0.2564 (Mac OS X 10.11.3) ERROR 
    Error: XHR error (404 Not Found) loading http://localhost:9876/node_modules/@ngrx/store/dist/store.js 

、それはまだモジュールを見つけることができません。ただし、モジュールへの正しいパスであり、ブラウザにロードされたときに機能します。

私は次の作業をかなり失っています。誰かが私を正しい方向に向けることができますか?

注意すべきいくつかのこと:その依存関係がこれだけSystemJSするノードモジュールで発生SystemJS

  • で解決する必要があるため

    • カルマのfiles配列にノードモジュールを追加するには、オプションではありません所在地に関するカスタム指示が必要です。私は特定の場所に限りSystemJSを設けることなく、私のテストではうまく他のモジュールをロードすることができますここではそれを

    を見つけることができ、私のカルマの設定です:

    // Set up with the help of 
    // http://twofuckingdevelopers.com/2016/01/testing-angular-2-with-karma-and-jasmine/ 
    
    module.exports = function(config) { 
        config.set({ 
    
        basePath: '.', 
    
        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.dev.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}, 
    
         // paths loaded via module imports 
         {pattern: 'src/**/*.js', included: false, watched: true}, 
    
         // paths to support debugging with source maps in dev tools 
         {pattern: 'src/**/*.ts', included: false, watched: false}, 
         {pattern: 'src/**/*.js.map', included: false, watched: false} 
        ], 
    
        // proxied base paths 
        proxies: { 
         // required for component assets fetched by Angular's compiler 
         '/src/': '/base/src/' 
        }, 
    
        port: 9876, 
    
        logLevel: config.LOG_INFO, 
    
        colors: true, 
    
        autoWatch: true, 
    
        browsers: ['Chrome'], 
    
        // Karma plugins loaded 
        plugins: [ 
         'karma-jasmine', 
         'karma-coverage', 
         'karma-chrome-launcher' 
        ], 
    
        // // Coverage reporter generates the coverage 
        // reporters: ['progress', 'dots', 'coverage'], 
        // 
        // // Source files that you wanna generate coverage for. 
        // // Do not include tests or libraries (these files will be instrumented by Istanbul) 
        // preprocessors: { 
        // 'src/**/!(*spec).js': ['coverage'] 
        // }, 
    
        // coverageReporter: { 
        // reporters:[ 
        //  {type: 'json', subdir: '.', file: 'coverage-final.json'} 
        // ] 
        // }, 
    
        singleRun: true 
        }) 
    }; 
    

    そして、ここでは私のカルマシムです:

    // Tun on full stack traces in errors to help debugging 
    Error.stackTraceLimit = Infinity; 
    
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000; 
    
    // // Cancel Karma's synchronous start, 
    // // we will call `__karma__.start()` later, once all the specs are loaded. 
    __karma__.loaded = function() {}; 
    
    System.config({ 
        packages: { 
        'base/src': { 
         defaultExtension: 'js', 
         format: 'register', 
         map: Object.keys(window.__karma__.files).filter(onlyAppFiles).reduce(createPathRecords, {}) 
        } 
        }, 
        // This makes it work in the browser, but not in my tests! 
        paths: { '@ngrx/store' : 'node_modules/@ngrx/store/dist/store.js' } 
    }); 
    
    System.import('angular2/src/platform/browser/browser_adapter') 
        .then(function(browser_adapter) { browser_adapter.BrowserDomAdapter.makeCurrent(); }) 
        .then(function() { return Promise.all(resolveTestFiles()); }) 
        .then(function() { __karma__.start(); }, function(error) { __karma__.error(error.stack || error); }); 
    
    function createPathRecords(pathsMapping, appPath) { 
        // creates local module name mapping to global path with karma's fingerprint in path, e.g.: 
        // './vg-player/vg-player': 
        // '/base/src/vg-player/vg-player.js?f4523daf879cfb7310ef6242682ccf10b2041b3e' 
        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; 
    } 
    
    function onlyAppFiles(filePath) { 
        return /\/base\/src\/(?!.*\.spec\.js$).*\.js$/.test(filePath); 
    } 
    
    function onlySpecFiles(path) { 
        return /\.spec\.js$/.test(path); 
    } 
    
    function resolveTestFiles() { 
        return Object.keys(window.__karma__.files) // All files served by Karma. 
        .filter(onlySpecFiles) 
        .map(function(moduleName) { 
         // loads all spec files via their global module names (e.g. 
         // 'base/src/vg-player/vg-player.spec') 
         return System.import(moduleName); 
        }); 
    } 
    

    更新

    エラーhereとの例リポジトリがあります。エラーの原因となる特定の変更が表示されますhere。エラーを表示するには$ npm install$ npm testを実行します。

  • +0

    :へのごkarma-test-shim.js変更System.config.map

    ブラウザ。パスはここで問題と思われる。これに関するアップデートや、あなたの問題は解決しましたか? – Gary

    +0

    まだ解決されていません。賞金を開くことを考えている。私はこれを解決する必要があります。 – weltschmerz

    +0

    gitリポジトリとして[mcve](http://stackoverflow.com/help/mcve)をアップロードできますか? –

    答えて

    7

    残りのバンドルに@ngrx/storeを含めると、404エラーが解決されます

    // for testing in karma.conf.js 
        files: [ 
         // paths loaded by Karma 
         {pattern: 'node_modules/@ngrx/store/dist/store.js', included: true, watched: true}, 
        ], 
    

    しかし、システムモジュールとしてコンパイルされているバンドルの残りの部分とは異なり、@ngrx/storeはcommonjsモジュールとしてエラーが発生

    // 'node_modules/angular2/bundles/angular2.dev.js' 
    "format register"; 
    System.register("angular2/src/facade/lang", [], true, function(require, exports, module) { 
    .... 
    
    // 'node_modules/rxjs/bundles/Rx.js' 
    "format register"; 
    System.register("rxjs/util/root", [], true, function(require, exports, module) { 
    .... 
    
    // 'node_modules/@ngrx/store/dist/store.js' 
    .... 
    var Observable_1 = require('rxjs/Observable'); 
    .... 
    

    コンパイルされています

    Uncaught ReferenceError: require is not defined

    // with {pattern: '~/store.js', indluded: true} 
    // context.html includes 
    <script type="text/javascript" src="/base/node_modules/@ngrx/store/dist/store.js?fb5e807149603c3c2f998c98faf6826c7e301d71"></script> 
    

    なぜですそれを含むべきではない:

    {pattern: 'node_modules/@ngrx/store/dist/store.js', included: false, watched: true} 
    

    これは基本的にwindow.__karma__.filesオブジェクトにリストしますが、カルマのcontext.htmlにスクリプトとして追加しません。ブラウザはエラーの原因となるコードをロードして実行しません。 ...

    singleRun: falseでカルマテストを実行すると、ChromeのDevtools>ネットワークでファイルを調べることができます。あなたはそこにロードされたファイルの一覧が表示されますし、パズルの最後のピースがどこにあるというのです:からテストするとき、私は同様の問題に直面しています

    map: { '@ngrx/store' : '/base/node_modules/@ngrx/store/dist/store.js' } 
    

    Executed 4 of 4 SUCCESS (0.037 secs/0.008 secs)

    +0

    ニース。ありがとうございました。 – weltschmerz

    +0

    'files'からパターンを削除し、' map'をSystem.configに追加するだけでしたか? –

    +0

    @mithun_daa 'files []'にパターンを残すか、SystemJSがファイルをロードしようとしたときにファイルが提供されませんでした。 'include:false'を設定してブラウザにロードされて実行されないようにするだけで、読み込みをSystemJSに任せます。 – Sasxa

    0

    修正を含むPRを送信しました。そこにこれを行うには良い方法であることが、これは動作しますがあります

    コピーstore.jsファイルdistフォルダにpackage.json年代を更新することにより、buildスクリプト

    ... && cp node_modules/@ngrx/store/dist/store.js dist/store.js 
    

    更新karma-test.shim.js

    paths: { '@ngrx/store' : '/base/dist/store.js' } 
    
    でパス
    +2

    PRに感謝しますが、これは機能しません。パッケージを動かすことと本質的に同じです。これがさらに多くのパッケージで起こるならば、それはまたスケールされません。私はなぜSystemJSがモジュールをロードしてそれに対する修正を見つけることができないのか理解したいと思います。 – weltschmerz

    +0

    私は、パス、カルマ、SystemJSにも問題があります。これに修正がありましたか? –

    関連する問題