2017-06-23 24 views
7

के लिए स्रोत मानचित्र नहीं ढूंढ सकते हैं मैं कर्म, जैस्मीन और वेबपैक का उपयोग करके अपने टाइपस्क्रिप्ट एप्लिकेशन का परीक्षण करने के लिए (कवरेज के साथ) परीक्षण करने की कोशिश कर रहा हूं। निम्नलिखित के साथ, मैं परीक्षणों को सफलतापूर्वक चलाने में सक्षम हूं, लेकिन कवरेज को सही तरीके से उत्पन्न करने में असमर्थ हूं। मैं karma-remap-coverage (https://github.com/sshev/karma-remap-coverage) का उपयोग कर रहा हूं और यह काफी आसान लगता है।कर्म + जैस्मीन + टाइपस्क्रिप्ट + वेबपैक

यह दिखता है जैसे कि कुछ दिलचस्प हो रहा है (और मुझे कुछ प्रकार की कवरेज रिपोर्ट मिल रही है) लेकिन यहां कुछ और बदलावों के साथ, संख्याएं काफी बदलती हैं और मैं वास्तव में स्रोतमैप लोड नहीं कर सकता।

यहाँ बुनियादी सेटअप है:

मैं एक src निर्देशिका है कि 10 .ts फ़ाइलें हैं की है। इस समय केवल एक के पास .spec फ़ाइल है।

spec फ़ाइल बहुत आसान है और सिर्फ पर्याप्त है कि मैं परीक्षण चला सकते हैं साबित करने के लिए किया गया था:

{ 
    "compilerOptions": { 
    "module": "commonjs", 
    "target": "es6", 
    "noImplicitAny": false, 
    "sourceMap": true, 
    "lib": ["es6", "dom"], 
    "experimentalDecorators": true 
    }, 
    "exclude": [ 
    "node_modules" 
    ] 
} 

और karma.conf.js:

import ComponentToTest from './componentToTest'; 

describe('ComponentToTest',() => { 

    it('should run a test',() => { 
     expect(1+1).toBe(2); 
    }); 

    it('should be able to invoke the a method',() => { 
     spyOn(ComponentToTest, 'foo').and.callThrough(); 
     ComponentToTest.foo('testing foo'); 
     expect(ComponentToTest.foo).toHaveBeenCalled(); 
    }); 

}); 

यह एक आकर्षण की तरह काम करता है जब मेरी tsconfig.json फ़ाइल के साथ रखा फ़ाइल:

module.exports = config => config.set({ 

    frameworks: ['jasmine'], 

    mime: { 'text/x-typescript': ['ts','tsx'] }, 

    // if I make this a generic './src/**/*.ts' it seems to freeze up 
    // without throwing any errors or running any tests, but that seems 
    // like a separate issue... 
    files: [ 
     './src/lib/componentToTest.ts', 
     './src/lib/componentToTest.spec.ts' 
    ], 

    preprocessors: { 
     './src/**/*.spec.ts': ['webpack'], 
     './src/**/*.ts': ['webpack', 'sourcemap', 'coverage'] 
    }, 

    webpack: { 
     devtool: "source-map", 
     module: { 
      rules: [ 
       { 
        test: /\.ts?$/, 
        loader: 'ts-loader', 
        exclude: /node_modules/ 
       } 
      ] 
     }, 
     resolve: { 
      extensions: [".ts", ".js"] 
     } 
    }, 

    webpackMiddleware: { 
     quiet: true, 
     stats: { 
      colors: true 
     } 
    }, 

    // add both "karma-coverage" and "karma-remap-coverage" reporters 
    reporters: ['progress', 'coverage', 'remap-coverage'], 

    // save interim raw coverage report in memory 
    coverageReporter: { 
     type: 'in-memory' 
    }, 

    // define where to save final remaped coverage reports 
    remapCoverageReporter: { 
     'text-summary': null, 
     html: './coverage/html', 
     cobertura: './coverage/cobertura.xml' 
    }, 

    colors: true, 

    // start these browsers 
    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher 
    browsers: ['Chrome'], 

    // Continuous Integration mode 
    // if true, Karma captures browsers, runs the tests and exits 
    singleRun: true 

}); 

और एफ inally, मैं एक साधारण Gulp कार्य के साथ परीक्षण शुरू करने हूँ:

Chrome 58.0.3029 (Mac OS X 10.12.3): Executed 1 of 2 SUCCESS (0 secs/0.002 secs) 
Chrome 58.0.3029 (Mac OS X 10.12.3): Executed 2 of 2 SUCCESS (0.026 secs/0.004 secs) 
[Error: Could not find source map for: "app/src/lib/componentToTest.ts"] 
[Error: Could not find source map for: "app/src/lib/componentToTest.spec.ts"] 

========================= Coverage summary ========================= 
Statements : 43.69% (322/737) 
Branches  : 15.7% (38/242) 
Functions : 35.47% (61/172) 
Lines  : 44.91% (322/717) 
==================================================================== 

तो कुछ हो रहा है:

gulp.task('test', function (done) { 
    new Server({ 
    configFile: __dirname + '/karma.conf.js', 
    singleRun: true 
    }, (exitCode) => { 
    done(); 
    process.exit(exitCode); 
    }).start(); 
}); 

जब चलाने के लिए, मैं एक निर्गम कि लगता है (अधिकतर) होनहार प्राप्त करें! जो मुझे महसूस करता है कि मैं करीब हूं। जब मैं एक ब्राउज़र में मेरी कवरेज रिपोर्ट पर ब्राउज़ करें, मैं दोनों .spec.ts फ़ाइल और .ts फ़ाइल को सूचीबद्ध देखते हैं (जो फिर से है, और करीब हो रही है), लेकिन मैं काफी वहाँ कारणों की एक जोड़ी के लिए नहीं कर रहा हूँ:

  1. कवरेज रिपोर्ट में .spec.ts फ़ाइल शामिल की जा रही है। चूंकि यह परीक्षण फ़ाइल है, इसलिए मैं इसे शामिल नहीं करना चाहता हूं।
  2. स्रोत मानचित्र ठीक से उत्पन्न नहीं किए जा रहे हैं - यह कंसोल में त्रुटियों और विशिष्ट फ़ाइल की कवरेज रिपोर्ट ब्राउज़ करने में असमर्थता से स्पष्ट है।

मुझे लगता है कि मैं बहुत प्यारा हूं। क्या कुछ आसान है कि मुझे याद आ रही है या सुझाव?

अद्यतन:

मुझे एहसास हुआ कि मैं नोड के एक पुराने संस्करण का उपयोग कर रहा था और सोचा था कि कुछ समस्या आ रही हो सकता है।मैं 6.11.0 करने के लिए उन्नत और जब तक कि कुछ भी हल नहीं किया था, यह थोड़ा और अधिक संदर्भ प्रदान किया:

त्रुटियों remap-istanbul द्वारा रिपोर्ट किया जा रहा है (वहाँ कोई आश्चर्य की बात, वास्तव में):

CoverageTransformer.addFileCoverage (/app/node_modules/remap-istanbul/lib/CoverageTransformer.js:148:17) 

मैं [email protected] उपयोग कर रहा हूँ जो [email protected] का उपयोग करता है - ऐसा लगता है कि अतीत में remap-istanbul के साथ समस्याएं हैं, लेकिन संस्करण का उपयोग नहीं कर रहा हूं।

इसके अलावा Webpack 2.6.1 और टाइपप्रति 2.3.2 का उपयोग कर

उत्तर

6

ठीक है, अलग अलग बातें की कोशिश कर के कई दिनों के बाद, मैं अंत में एक समाधान है कि काम करता है पाया है। मुझे यकीन नहीं है कि विशेष रूप से मेरी पहली पोस्ट में समस्या का कारण क्या था, लेकिन यहां मैं कहां समाप्त हुआ हूं। यह किसी और के लिए वास्तव में सरल टाइपस्क्रिप्ट, कर्म, जैस्मीन, वेबपैक (कवरेज के साथ) सेटअप की तलाश में सहायक हो सकता है।

  • मेरी फ़ाइल संरचना और spec फ़ाइल वही रही।
  • मेरे tsconfig.json के लिए अद्यतन:

    { 
        "compilerOptions": { 
        "module": "commonjs", 
        "target": "es6", 
        "noImplicitAny": false, 
        "inlineSourceMap": true, // this line 
        "sourceMap": false, // and this one 
        "experimentalDecorators": true, 
        "lib": ["es6", "dom"] 
        }, 
        "exclude": [ 
         "node_modules" 
        ] 
    } 
    
  • मैं awesome-typescript-loader बजाय ts-loader का उपयोग कर करने लगे।

  • और अंत में, मेरी karma.conf.js फ़ाइल अब लगता है कि:

    module.exports = config => config.set({ 
    
        // base path that will be used to resolve all patterns (eg. files, exclude) 
        basePath: '', 
    
        frameworks: ['jasmine'], 
    
        mime: { 'text/x-typescript': ['ts','tsx'] }, 
    
        files: [ 
         'node_modules/angular/angular.min.js', 
         './src/**/*.ts' 
        ], 
    
        preprocessors: { 
         './src/**/*.ts': ['webpack'] 
        }, 
    
        webpack: { 
    
         devtool: 'inline-source-map', 
         module: { 
          rules: [ 
           { 
            enforce: 'pre', 
            test: /\.js$/, 
            loader: 'source-map-loader', 
            exclude: [ 
             'node_modules', 
             /\.spec\.ts$/ 
            ] 
           }, 
           { 
            test: /\.ts?$/, 
            use: [ 
             { 
              loader: 'awesome-typescript-loader', 
              query: { 
               /** 
               * Use inline sourcemaps for "karma-remap-coverage" reporter 
               */ 
               sourceMap: false, 
               inlineSourceMap: true, 
               compilerOptions: { 
                removeComments: true 
               } 
              }, 
             } 
            ] 
           }, 
           { 
            enforce: 'post', 
            test: /\.(js|ts)$/, 
            loader: 'istanbul-instrumenter-loader', 
            exclude: [ 
             /node_modules/, 
             /\.spec\.ts$/ 
            ] 
           }, 
           { test: /\.html$/, loader: 'html-loader' } 
          ] 
         }, 
         resolve: { 
          extensions: [".ts", ".js", ".html"] 
         }, 
         externals: { 
          angular: "angular" 
         } 
        }, 
    
        webpackMiddleware: { 
         quiet: true, 
         stats: { 
          colors: true 
         } 
        }, 
    
        // add both "karma-coverage" and "karma-remap-coverage" reporters 
        reporters: ['progress', 'coverage', 'remap-coverage'], 
    
        // save interim raw coverage report in memory 
        coverageReporter: { 
         type: 'in-memory' 
        }, 
    
        // define where to save final remaped coverage reports 
        remapCoverageReporter: { 
         'text-summary': null, 
         html: './coverage/html', 
         cobertura: './coverage/cobertura.xml' 
        }, 
    
        colors: true, 
    
        // start these browsers 
        // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher 
        browsers: ['Chrome'], 
    
        // Continuous Integration mode 
        // if true, Karma captures browsers, runs the tests and exits 
        singleRun: true 
    
    }); 
    

अंतिम पैकेज संस्करणों में शामिल हैं:

  • नोड 4.2.6 (मैं भी करने के लिए इस प्राप्त करने में सक्षम था नोड के एक नए संस्करण के साथ काम करें, लेकिन अन्य कारणों से यहां रहने की आवश्यकता है)
  • भयानक प्रकार स्क्रिप्ट-लोडर 3.1.2
  • इस्तांबुल-instrumenter-लोडर 2.0.0
  • चमेली कोर 2.5.2
  • कर्म 1.6.0
  • कर्म-क्रोम लांचर 2.0.0
  • कर्म-कवरेज 1.1.1
  • कर्म-चमेली 1.1.0
  • कर्म-remap-कवरेज 0.1.4
  • कर्म-webpack 2.0.3
  • टाइपप्रति 2.3.2
  • webpack 2.6.1

अब मेरी परीक्षण चला, वहाँ कंसोल में कोई त्रुटि नहीं है, और मैं मूल टाइपप्रति फ़ाइलों की एक कवरेज रिपोर्ट है! https://github.com/AngularClass/angular-starter/tree/master/config

:

ऋण का लोगों ने इस एक साथ रखा करने के लिए बहुत सारे (यह काफी अपने अंतिम समाधान का एक सा मार्गदर्शक समाप्त)

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