2015-01-23 9 views
11

चलाने के लिए ग्रंट कर्मा प्राप्त करना मैं सोच रहा था कि किसी को भी घड़ी पर बदला गया एक ही नमूना चलाने के लिए परेशान कर्म मिला है। यह नीचे मेरी विन्यास है। समस्या यह है कि लाइन grunt.config ('karma.unit.options.files', filepath); ऐसा लगता है कि सभी चश्मा अभी भी नहीं चल रहे हैं, हालांकि फू को कर्म से पहले आउटपुट मिलता है: यूनिट: रन निकाल दिया जाता है।एक यूनिट परीक्षण

grunt.initConfig({ 
    karma: { 
     unit: { 
      configFile: 'karma.conf.js', 
      background: true, 
      singleRun: false, 
      options: { 
       files: allFilesArray 
      } 
     } 
    }, 
    watch: { 
     options: { 
      spawn: false, 
      livereload: true 
     }, 
     karma: { 
      files: ['js/spec/**/*.spec.js', 'js/src/**/*.js'], 
      tasks: ['karma:unit:run'] 
     } 
    } 
}) 

grunt.event.on('watch', function (action, filepath){ 
    console.log('foo'); 
    grunt.config('karma.unit.options.files', filepath); 
}); 

क्या वहां कोई है जो फ़ाइल परिवर्तन पर टर्मिनल में एक स्पेक चलाने में सफल रहा है? हमारे पास हजारों परीक्षण हैं इसलिए यह धीमा हो रहा है।

धन्यवाद, एलेक्स

+0

संबंधित कर्मा मुद्दा: https://github.com/karma-runner/karma/मुद्दों/1507 # अंकन-320383049 – Stefan

+0

गुलप के समाधान के साथ संबंधित प्रश्न: https://stackoverflow.com/questions/26552729/karma-run-single-test/45350941#45350941 – Stefan

उत्तर

7

मुझे यह काम करने के लिए मिला। असल में, जब भी कोई फ़ाइल बदलती है तो आप कर्म कॉन्फ़िगरेशन को गतिशील रूप से बदलने के लिए ईवेंट हैंडलर के साथ घड़ी का उपयोग करते हैं। यहां रैंडडाउन है:

मेरी ग्रंट कॉन्फ़िगरेशन में दो कर्म कार्य हैं: "सब" और "एक"। "सब" उन सभी को चलाता है, और "एक" केवल एक ही फाइल चलाता है जिसे पहले से नहीं पता है।

grunt.initConfig({ 
    // ... 
    karma: { 
    all: { 
     configFile: 'karma.conf.js', 
     browsers: ['PhantomJS'], 
     singleRun: true, 
     options: { 
     files: [ 
      'bower_components/jquery/dist/jquery.js', // dependencies 
      'src/js/**/*.js', // js source files 
      'src/js/**/*.spec.js' // unit test files 
     ] 
     } 
    }, 
    one: { 
     configFile: 'karma.conf.js', 
     browsers: ['PhantomJS'], 
     singleRun: true, 
     files: [ 
     {src: 'bower_components/jquery/dist/jquery.js'}, // dependencies 
     {src: ['src/js/**/*.js','!src/js/**/*.spec.js']} // source files 
     // (exclude the unit test files) 
     // watchEventListener will add the unit test file to run 
     ] 
    } 
    }, 
    // ... 
}); 

और फिर बाद में मेरी गड़बड़ी में, मैं घड़ी की घटनाओं के लिए श्रोता जोड़ता हूं। यह श्रोता कर्म को अद्यतन करता है: एक कार्य और इकाई परीक्षण फ़ाइल जोड़ता है। हम मूल फाइल सरणी की एक प्रति रखते हैं, या फिर हमारे जोड़ों को घड़ी के कार्यकाल के जीवनकाल के माध्यम से जारी और जमा होगा।

// when a unit test changes, execute only it 
var original_karmaOne_files = grunt.config.get('karma.one.files'); // keep the original files array 
grunt.event.on('watch', function watchEventListener(action, filepath, target){ 

    // this handler handles ALL watch changes. Try to filter out ones from other watch tasks 
    if (target == 'js_spec') handleJSHintSpec(); 

    // --------------------- 
    function handleJSHintSpec() { 
    if (action == 'deleted') return; // we don't need to run any tests when a file is deleted 
    // this will probably fail if a watch task is triggered with multiple files at once 
    // dynamically change the config 
    grunt.config.set('karma.one.files', [].concat(original_karmaOne_files, [{src: filepath}])); 
    } 
}); 

और यहाँ मेरी gruntfile की घड़ी काम है:

watch: { 
    // ... 
    // when js spec files change, 
    // lint them 
    // run unit tests 
    js_spec: { 
    options: { 
     interrupt: true 
    }, 
    files: 'src/js/**/*.spec.js', 
    tasks: ['jshint:js_spec', 'karma:one'] 
    }, 
    // ... 
} 

मेरे karma.conf.js फ़ाइल सुंदर डिफ़ॉल्ट है, लेकिन इसके फ़ाइलें सरणी खाली है। असल में, मैंने इसे टिप्पणी की, इसलिए संपत्ति अपरिभाषित है।

// list of files/patterns to load in the browser 
//files: [], // specified in the gruntfile 
+2

इसके अलावा, मैंने पाया कि फाइल सरणी आवश्यक है एक 'src' संपत्ति के साथ वस्तुओं को शामिल करें - नहीं टी सरल फ़ाइलपाथ तार, या अन्यथा यह असफल रहा। –

+0

इसके अलावा, प्रत्येक घड़ी लक्ष्य में 'स्पॉन' विकल्प गलत पर सेट होना चाहिए, या फिर 'grunt.config.set()' का कोई प्रभाव नहीं पड़ेगा। –

+1

उस महान प्रारंभिक बिंदु और टिप्पणियों के लिए धन्यवाद। फिर भी यह मुझे काम करने के लिए कुछ समय लगा। मैंने अपने परिणामस्वरूप Gruntfile.js को नीचे दिए गए उत्तर के रूप में जोड़ा। – Stefan

2

टी एल; डीआर: कर्म का प्रयोग करें: कर्म के बजाए हर जगह यूनिट: यूनिट: grunt.event.on ('watch', function() {}) चलाएं और उपयोग करें; कर्म कॉन्फ़िगरेशन को संपादित करने के लिए केवल उन परीक्षण फ़ाइलों को शामिल करें जिन्हें आप चलाना चाहते हैं।

मेरे पास यह काम है, लेकिन हो सकता है कि आप जो भी चाहते हों। जब भी मैं एक फ़ाइल सहेजता हूं, मैं सर्वर को फिर से शुरू कर रहा हूं। आगे स्पष्टीकरण नीचे है। यहाँ config के कुछ है:

watch: { 
     tests: { 
      files: 'tests/**/*.js', 
      tasks: ['karma:unit'] 
     }, 
     tsChanged: { 
      files: config.tsFiles, 
      tasks: [ 
       'ts', 
       'karma:unit' 
      ] 
     } 
    } 

    grunt.event.on('watch', function(action, filepath){ 
     grunt.config(['karma', 'unit', 'files'], [{ 
      src: [ 
       path/to/your/source/files, 
       path/to/your/test/file, 
      ] 
     }]); 
    }); 

यह है कि कर्म एप्लिकेशन फ़ाइलें और ब्राउज़र में परीक्षण फ़ाइलों के सभी जब भी यह सर्वर शुरू होता लोड करता है मुझे लगता है। आपके मामले में, यह तब होगा जब आप कमांड लाइन में "ग्रंट कर्मा: यूनिट: स्टार्ट घड़ी" दर्ज करेंगे। तो यहां, मैंने "गड़बड़ घड़ी" का उपयोग किया और बस प्रक्रिया में "कर्म: इकाई" जोड़ा। फिर मैंने सहेजने की घटना पकड़ी और सर्वर शुरू करने से पहले कर्म कॉन्फ़िगरेशन को अपडेट किया।

उम्मीद है कि इससे मदद मिलती है।

1

yargs का एक संयोजन और कुछ क्रम-जादू का उपयोग करना, मैं यह कर:

var argv = require('yargs') 
    .default('t', '*.js') 
    .alias('t', 'tests') 
    .describe('t', 'A file or file pattern of the test files to run, relative to the test/unit dir') 
    .help('?') 
    .alias('?', 'help') 
    .argv; 

var filesToLoad = ['src/**/*.js', 'test/unit/helpers/*.js']; 
filesToLoad.push(path.join('test/unit/**', argv.t)); 

gulp.task('tdd', function (done) { 
    karma.start({ 
     configFile: __dirname + '/../../karma.conf.js', 
     jspm: { 
      loadFiles: filesToLoad, 
     } 
    }, function(e) { 
     done(); 
    }); 
}); 

कौन सा घूंट और लोड करने के लिए एक तर्क के रूप में एक परीक्षण फ़ाइल/पथ पैटर्न लेता है कि वरीयता में सभी फाइल

0

मैथियस के उत्तर और मेरी ग्रंडफाइल टिप्पणियों के आधार पर।js है:

module.exports = function (grunt) { 

    grunt.initConfig({ 
     pkg: grunt.file.readJSON('package.json'), 
     karma: { 
      all: { 
       configFile: 'karma.conf.js',    
       background: true, 
       files: [ 
        { src: './Leen.Managementsystem/bower_components/jquery/dist/jquery.js' }, 
        { src: './Leen.Managementsystem/bower_components/globalize/lib/globalize.js' }, 
        { src: './Leen.Managementsystem/bower_components/**/*.js', included: false }, 
        { src: './Leen.Managementsystem.Tests/App/test/mockFactory.js', included: false }, 
        { src: './Leen.Managementsystem/App/**/*.js', included: false }, 
        { src: './Leen.Managementsystem.Tests/App/test/*.js', included: false }, 
        { src: './Leen.Managementsystem.Tests/App/**/*.spec.js', included: false }, 
        { src: './Leen.Managementsystem.Tests/App/test-main.js' } 
       ] 
      }, 
      one: { 
       configFile: 'karma.conf.js',    
       files: [ 
        { src: './Leen.Managementsystem/bower_components/jquery/dist/jquery.js' }, 
        { src: './Leen.Managementsystem/bower_components/globalize/lib/globalize.js' }, 
        { src: './Leen.Managementsystem/bower_components/**/*.js', included: false }, 
        { src: './Leen.Managementsystem.Tests/App/test/mockFactory.js', included: false }, 
        { src: './Leen.Managementsystem/App/**/*.js', included: false }, 
        { src: './Leen.Managementsystem.Tests/App/test/*.js', included: false },   
        // (do not inlcude the *.spec.js files here! The watch event listener will add the single spec file to run) 
        { src: './Leen.Managementsystem.Tests/App/test-main.js' } 
       ] 
      } 
     }, 
     watch: {   
      spec_js: { 
       options: { 
        interrupt: true, 
        spawn: false 
       }, 
       files: 'Leen.Managementsystem.Tests/App/**/*.spec.js', 
       tasks: ['karma:one:start']    
      } 
     } 
    }); 

    var originalKarmaOneFiles = grunt.config.get('karma.one.files'); // keep the original files array 

    grunt.event.on('watch', function watchEventListener(action, filepath, target) { 

     if (target === 'spec_js') { 
      handleChangedSpecFile(); 
     } 

     function handleChangedSpecFile() { 
      if (action === 'deleted') { 
       return; 
      }   

      var testFilePath = "./" + filepath.replace(/\\/g, "/"); 

      grunt.log.writeln(['Running single karma test for: ' + testFilePath]); 
      var updatedFiles = originalKarmaOneFiles.concat([{ src: testFilePath, included: false }]); 

      grunt.config.set('karma.one.files', updatedFiles); 
     } 
    }); 


    grunt.loadNpmTasks('grunt-karma'); 
    grunt.loadNpmTasks('grunt-contrib-watch'); 

    grunt.registerTask('default', ['karma:all','watch']); 

}; 

karma.conf.js:

module.exports = function(config) { 
    config.set({ 

     // base path, that will be used to resolve files and exclude 
     basePath: '', //the solution root path, e.g. D:\Energienetzwerke\trunk 


     // frameworks to use 
     frameworks: ['jasmine', 'requirejs'], 

     // list of files/patterns to load in the browser 
     files: [ 
     './Leen.Managementsystem/bower_components/jquery/dist/jquery.js', 
     './Leen.Managementsystem/bower_components/globalize/lib/globalize.js', 
     { pattern: './Leen.Managementsystem/bower_components/**/*.js', included: false }, 
     { pattern: './Leen.Managementsystem.Tests/App/test/mockFactory.js', included: false }, 
     { pattern: './Leen.Managementsystem/App/**/*.js', included: false }, 
     { pattern: './Leen.Managementsystem.Tests/App/test/*.js', included: false}, 
     { pattern: './Leen.Managementsystem.Tests/App/**/*.spec.js', included: false}, 
     './Leen.Managementsystem.Tests/App/test-main.js' 
     ], 


     // list of files to exclude 
     exclude: [ 
     './Leen.Managementsystem/App/main.js' 
     ], 


     // test results reporter to use 
     // possible values: 'dots', 'progress', 'junit', 'growl', 'coverage' 
     reporters: ['progress', 'coverage', 'notify', 'htmlDetailed', 'xml'], 



     coverageReporter: { 
     dir: './Leen.Managementsystem.Tests/testCoverage', 
     reporters: [ 
      { type: 'html',subdir: 'html'}, 
      { type: 'cobertura',subdir: 'xml', file: 'coverage.xml' }, 
      { type: 'lcov', subdir: 'lcov' }, 
      { type: 'text-summary' } 
      ] 
     }, 


     notifyReporter: { 
     reportEachFailure: true, // Default: false, Will notify on every failed spec 
     reportSuccess: false // Default: true, Will notify when a suite was successful 
     }, 

     htmlDetailed: { 
     autoReload: true, 
     dir: './Leen.Managementsystem.Tests/testResults' 

     }, 
    preprocessors: { 
     // source files, that you wanna generate coverage for 
     // do not include tests or libraries 
     // (these files will be instrumented by Istanbul) 
     './Leen.Managementsystem/App/**/*.js': ['coverage'] 
    }, 


    // web server port 
    port: 9876, 


    // enable/disable colors in the output (reporters and logs) 
    colors: true, 


    // level of logging 
    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG 
    logLevel: config.LOG_INFO, 


    // enable/disable watching file and executing tests whenever any file changes 
    autoWatch: false, //watching is done by Gruntfile.js to only execute changed tests 
    usePolling: true, 

    // Start these browsers, currently available: 
    // - Chrome 
    // - ChromeCanary 
    // - Firefox 
    // - Opera 
    // - Safari (only Mac) 
    // - PhantomJS 
    // - IE (only Windows) 
    browsers: ['Chrome_With_Saved_DevTools_Settings'], 

    customLaunchers: { 
     Chrome_With_Saved_DevTools_Settings: { 
      base: 'Chrome', 
      chromeDataDir: './.chrome'    
     } 
    }, 


    // If browser does not capture in given timeout [ms], kill it 
    captureTimeout: 60000, 


    // Continuous Integration mode 
    // if true, it capture browsers, run tests and exit 
    singleRun: true 
    }); 
}; 

package.json:

{ 
    "name": "solution", 
    "version": "1.0.0", 
    "description": "contains packages that are needed for running karma", 
    "main": "./Leen.Managementsystem.Tests/App/test-main.js", 
    "dependencies": { 
    "grunt": "1.0.1", 
    "grunt-cli": "1.2.0", 
    "grunt-contrib-watch": "1.0.0", 
    "grunt-karma": "2.0.0", 
    "jasmine-core": "2.6.4", 
    "karma": "1.7.0", 
    "karma-chrome-launcher": "2.2.0", 
    "karma-cli": "1.0.1", 
    "karma-coverage": "1.1.1", 
    "karma-firefox-launcher": "1.0.1", 
    "karma-html-detailed-reporter": "1.1.20", 
    "karma-ie-launcher": "1.0.0", 
    "karma-jasmine": "1.1.0", 
    "karma-notify-reporter": "1.0.1", 
    "karma-phantomjs-launcher": "1.0.4", 
    "karma-requirejs": "1.1.0", 
    "karma-xml-reporter": "0.1.4", 
    "requirejs": "2.3.4" 
    }, 
    "devDependencies": {}, 
    "scripts": { 
    "test": "karma run" 
    }, 
    "author": "LEEN", 
    "license": "private" 
}