2016-02-15 9 views
9

मैं परीक्षण के लिए कोणीय 2, सिस्टमजेएस और कर्म का उपयोग करके एक वेब ऐप बना रहा हूं।कोणीय 2 में सिस्टमजेएस और कर्म के साथ लोड नोड मॉड्यूल 2

मैं एक परीक्षण में नोड मॉड्यूल ngrx/store लोड करने के लिए कोशिश कर रहा हूँ:

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... 
    }); 
}); 

लेकिन, मेरा परीक्षण निम्न संदेश के साथ असफल साथ ही, और यह पता चला है कि सिस्टमजेएस को पता नहीं था कि @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 

इसका मतलब यह है कि यह स्पष्ट पथ मैं इसे खाते में दिया ले जा किया जाना चाहिए, लेकिन यह अभी भी मॉड्यूल नहीं मिल रहा। मॉड्यूल के लिए यह सही पथ है, हालांकि, ब्राउज़र में लोड होने पर काम करता है।

मैं आगे क्या करना है इस पर बहुत खो गया हूं। क्या कोई मुझे सही दिशा दिखा सकता है?

कुछ बातें

गौर करने योग्य

  • कर्मा के files सरणी नोड मॉड्यूल जोड़ा जा रहा है एक विकल्प नहीं है, क्योंकि इसकी निर्भरता SystemJS
  • यह केवल नोड मॉड्यूल के साथ होता है के साथ हल करने की आवश्यकता है जो SystemJS के लिए वे कहां स्थित हैं पर कस्टम निर्देशों की आवश्यकता है। मैं एक विशिष्ट स्थान के रूप में लंबे 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

मैं इसी तरह के मुद्दों का सामना करना पड़ रहा है जब से परीक्षण ब्राउज़र। पथ यहां मुद्दा है। इस पर कोई अपडेट या आपकी समस्या हल हो गई थी? – Gary

+0

अभी तक हल नहीं हुआ है। एक बक्षीस खोलने के बारे में सोच रहा है। मुझे इसे ठीक करने की ज़रूरत है। – weltschmerz

+0

क्या आप एक [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 में एक स्क्रिप्ट के रूप में नहीं जोड़ा जाएगा - ब्राउज़र त्रुटि को उत्पन्न करने वाले कोड को लोड और चलाएगा नहीं। लोड हो रहा है SystemJS द्वारा नियंत्रित किया जाना चाहिए ...

यदि आप singleRun: false के साथ कर्म परीक्षण चलाते हैं तो आप क्रोम के देवटोल्स> नेटवर्क में फ़ाइलों का निरीक्षण कर सकते हैं। आप भरी हुई फाइलों की एक सूची दिखाई देगी और जहां पहेली के अंतिम टुकड़ा है कि है:

अपने karma-test-shim.js परिवर्तन System.config.map में करने के लिए:

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

तो क्या आपको बस 'फाइल' से पैटर्न को हटाना होगा और 'map' को System.config में जोड़ना होगा? –

+0

@mithun_daa आपको 'फ़ाइलों []' में पैटर्न रखना होगा, या जब सिस्टमजेएस इसे लोड करने का प्रयास करता है तो फ़ाइल नहीं दी जाएगी। आपको बस 'शामिल करें: झूठा' सेट करना होगा, इसलिए यह ब्राउज़र द्वारा लोड और निष्पादित नहीं है, और लोडिंग को SystemJS पर छोड़ दें। – Sasxa

0

फिक्स के साथ एक पीआर भेजा।ऐसा करने के लिए एक बेहतर तरीका हो सकता है, लेकिन यह काम करता है:

कॉपी 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

पीआर के लिए धन्यवाद, लेकिन यह काम नहीं करेगा। यह अनिवार्य रूप से पैकेज के चारों ओर ले जाने के समान ही है। यदि यह अधिक संकुल के साथ होता है तो यह भी स्केल नहीं करेगा। मैं समझना चाहता हूं कि SystemJS मॉड्यूल लोड नहीं कर सकता है और इसके लिए एक फिक्स पा सकता है। – weltschmerz

+0

मुझे पथ, कर्म और सिस्टमजेएस के साथ भी समस्याएं हैं। क्या इस पर कोई फिक्स था? –

संबंधित मुद्दे