2015-06-29 16 views
7

के साथ अज्ञात अनाम परिभाषित()" यूनिट परीक्षण स्थापित करने और चलाने के लिए मैं थोड़ी देर के लिए अटक गया हूं।"त्रुटि: कर्म + आवश्यकता जेएस + जैस्मीन

मेरे पास एक एंगुलरजेएस फ्रंट-एंड है जो आवश्यकता के लिए अनुकूलित RequJS और r.js के साथ लोड किया गया है, इसलिए यह सभी एक अच्छी तरह से एक फ़ाइल में है। यह काम!

यूनिट परीक्षण निष्पादित करने के लिए काम नहीं करता है। यह अभी तक कुछ भी कल्पना नहीं है, बस एक ट्यूटोरियल से एक स्टार्टर की प्रतिलिपि बनाई।

tests/user/user.test.js:

define(['angular', 'angular-mocks', 'app'], function(angular, app) { 
    describe('Unit: UserController', function() { 
    beforeEach(module('user.app')); 

    it('should do something', function() { 
     console.log('did it'); 
    }); 
    }); 
}); 

तो मैं एक karma.conf.js:

module.exports = function(config) { 
    config.set({ 
    logLevel: config.LOG_DEBUG, 
    basePath: './', 

    files: [ 
     // r.js'd app files 
     {pattern: 'dist/app.js', included: false}, 
     // the tests 
     {pattern: 'tests/**/*.test.js', included: true}, 
    ], 

    excluded: ['tests/main.test.js'] 

    frameworks: ['jasmine', 'requirejs'], 

    browsers: ['PhantomJS'], 

    plugins: [ 
     'karma-jasmine', 
     'karma-junit-reporter', 
     'karma-phantomjs-launcher', 
     'karma-requirejs' 
    ], 

    }); 
}; 

एक main.test.js:

var allTestFiles = []; 
var TEST_REGEXP = /(spec|test)\.js$/i; 

var pathToModule = function(path) { 
    var returnValue = path.replace(/^\/base\//, '').replace(/\.js$/, ''); 
    return returnValue; 
}; 

Object.keys(window.__karma__.files).forEach(function(file) { 
    if (TEST_REGEXP.test(file)) { 
    // Normalize paths to RequireJS module names. 
    allTestFiles.push(pathToModule(file)); 
    } 
}); 

require.config({ 
    baseUrl: '/base', 

    paths: { 
    'angular-mocks': 'node_modules/angular-mocks/angular-mocks', 
    'app': 'dist/app', 
    }, 

    deps: allTestFiles, 

    callback: function() { 
    console.log('load complete'); 
    window.__karma__.start(); 
    }, 
}); 

और अंत में एक gulp कार्य:

012,
var gulp = require('gulp'); 
var karma = require('karma').server; 

gulp.task('unit-test', function(done) { 
    karma.start({ 
    configFile: __dirname + '/karma.conf.js', 
     singleRun: true 
    }, function() { done(); }); 
} 

यहां और वहां मैंने कुछ लॉग आउटपुट जोड़े और यह दिखाता है कि फाइलें लोड की गई हैं।

लेकिन मुझे tests/user/user.test.js में यह अटक गया है और मुझे नहीं पता कि क्या गलत है। यहाँ आउटपुट है: http://pastebin.com/evJPj9B3

अगर मैं

define('namedtestorso', ['angular', 'angular-mocks', 'app'], function(angular, app) { 
    ... 

तरह इकाई परीक्षण मॉड्यूल का नाम ... मैं एक त्रुटि किसी भी अधिक नहीं मिलता है, लेकिन परीक्षण निष्पादित नहीं कर रहे हैं। चूंकि सभी उदाहरणों को मैं इसे याद कर सकता हूं क्योंकि इसे अनाम परिभाषित करता है, मुझे लगता है कि नामकरण सही नहीं है। लेकिन उस स्थिति में लॉग आउटपुट निष्पादित किया जाता है कि main.test.js से कॉन्फ़िगर कॉलबैक दो बार निष्पादित किया जाता है। (क्या यह किसी चीज के लिए संकेत है?)

अगर किसी को यह पता चल जाए कि इसे कैसे ठीक किया जाए/इसे चलाने के लिए या यहां तक ​​कि गलत क्या है, यह जानने के लिए कैसे अच्छा होगा। अग्रिम में धन्यवाद!

उत्तर

9

अब मुझे मिल गया यह चल रहा है तो मेरे समाधान यहाँ छोड़ देंगे:

मुझे लगता है कि मैं बेहतर अब कैसे karma काम करता है (कृपया मुझे बताओ अगर मैं गलत हूँ) थोड़ा समझा और इतने पाया मैं करना था क्या।

यह karma.conf.js में फ़ाइलों को डालने के बारे में लगता है ताकि वे लोड होने के लिए main.test.js के लिए उपलब्ध हों। अन्यथा वे "संदर्भ" से बाहर हैं और इन तक पहुंचा नहीं जा सकता है। लेकिन वहां डालने पर, included ध्वज को false पर सेट करना सुनिश्चित करें। karma.conf.js को

परिवर्तन:

files: [ 
    ... 
    // Also included these dependencies. All the others are minified in the 
    // app.js but if you don't do that, also include all project deps like 
    // AngularJS etc. 
    { pattern: 'node_modules/jasmine-core/lib/jasmine-core/boot.js', included: false }, 
    { pattern: 'node_modules/angular-mocks/angular-mocks.js', included: false}, 

    // Then I had an error in my pattern ('tests/**/*.test.js') 
    // Only the `main.test.js` is supposed to be included! 
    { pattern: 'tests/user/user.test.js', included: false } 
    { pattern: 'tests/main.test.js', included: true } 
    ... 

अगर मैं सही कर्म included: true के साथ एक HTML फ़ाइल और फ़ाइलें बनाता हूँ स्क्रिप्ट टैग के माध्यम से लोड किया जाएगा। यही कारण है कि यदि RequJS का उपयोग करना include से false पर सेट करना महत्वपूर्ण है, तो आपको Error: Mismatched anonymous define() मिल जाएगा यदि आप करते हैं। तो अब यह मुझे समझ में आता है।

इस समस्या को हल करने के बाद जहां मॉड्यूल के साथ कुछ अन्य नहीं मिला। क्योंकि मैंने RequJS ऑप्टिमाइज़र का उपयोग किया था, मुझे अपने सभी मॉड्यूल को मुख्य app.js फ़ाइलों में "मैप" करना था ताकि जब परीक्षण जेएस फ़ाइलों को एक निश्चित मॉड्यूल की आवश्यकता हो, तो RequJS यह सुनिश्चित कर सकता है कि यह लोड हो (या हो) हो।

paths: { 
    // Added these for example 
    'angular': '../dist/app', 
    'angular-ui-router': '../dist/app', 
    // (and also my project modules) 
    ... 

ठीक है, कि एक सा hacky लगता है:

तो मैं main.test.js में paths अनुभाग बदल रहा समाप्त हो गया। इस मुद्दे को हल करने के बाद में मैं देव फाइलों पर यूनिट परीक्षण चलाने के लिए अपना वर्कफ़्लो भी बदलता हूं और अन्य टूल्स पर सही तरीके से काम करने के लिए भरोसा करता हूं (और यदि ई 2 टेस्ट द्वारा पकड़े जाने वाले मुद्दे नहीं हैं)।

आशा है कि यह मेरी स्थिति में दूसरों की मदद करेगी!

0

वास्तव में यदि आप साइट requirejs को यह त्रुटि राज्यों जाना अगर आप किसी भी स्क्रिप्ट टैग html में इसका मतलब है karma.conf.js में कर्म द्वारा प्रदान की

तो जब आप की तरह फ़ाइलों को शामिल एचटीएमएल में शामिल हैं: फ़ाइलें [ '/base/src/scripts/xyz.js'] मेरी राय में यह एक स्क्रिप्ट टैग के रूप में जोड़ा गया है और यू प्राप्त करने में त्रुटि पर रखें: बेमेल गुमनाम परिभाषित() मॉड्यूल

कोशिश पैटर्न उदाहरण: { पैटर्न: '/base/src/scripts/xyz.js', शामिल: झूठा} जो स्क्रिप्ट टैग

में जेएस जोड़ने से रोकता है
संबंधित मुद्दे