कोणीय-क्ली के साथ केवल एक परीक्षण युक्ति कैसे निष्पादित करें


143

मैं Angular-CLI (बीटा 20) के साथ Angular2 प्रोजेक्ट बिल्ड है।

क्या केवल एक चयनित कल्पना फ़ाइल के खिलाफ परीक्षण चलाने का एक तरीका है?

मुझे Angular2 क्विक स्टार्ट पर आधारित एक प्रोजेक्ट मिलता था, और मैं मैन्युअल रूप से चमेली फाइल में स्पेक्स जोड़ सकता था। लेकिन मुझे नहीं पता कि इसे कर्म परीक्षण के बाहर कैसे स्थापित किया जाए या कर्म परीक्षणों को कोणीय-सीएलआई बिल्ड के साथ विशिष्ट फाइलों तक कैसे सीमित किया जाए।

जवाबों:


224

आपकी प्रत्येक .spec.tsफ़ाइल में इसके सभी परीक्षण describeइस तरह से अवरुद्ध हैं:

describe('SomeComponent', () => {...}

आप describeफ़ंक्शन नाम के साथ प्रीफ़िक्स करके, केवल इस एकल खंड को आसानी से चला सकते हैं f:

fdescribe('SomeComponent', () => {...}

यदि आपके पास ऐसा फ़ंक्शन है, तो कोई अन्य describeब्लॉक नहीं चलेगा। Btw। आप it=> के साथ भी ऐसा ही कर सकते हैं fitऔर एक "ब्लैकलिस्ट" संस्करण भी है x। इसलिए:

  • fdescribeऔर केवल चलाने के लिए इस तरह चिह्नित कार्यों का fitकारण बनता है
  • xdescribeऔर सभी कार्यों के xitकारण इस तरह से चलाने के लिए चिह्नित किया गया है

1
मैंने अपने helloworld.component.spec.ts फ़ाइल में fdescribe का उपयोग किया है, लेकिन app.component.spec.ts फ़ाइल की त्रुटियों को भी दिखाया गया है।
मास्टर योदा

1
ऐसा इसलिए है क्योंकि सभी कोड का मूल्यांकन किया जा रहा है (अन्यथा यह नहीं पता होगा कि आपके परीक्षणों के भीतर फ़ेस्क्राइबर्स हैं) - फ़ेडस् केवल परीक्षण परीक्षणों के परिणाम को सीमित करता है। आपको अन्य फ़ाइलों में सिंटैक्स / टाइपस्क्रिप्ट त्रुटियों को ठीक करने की आवश्यकता है।
टोमेक सुल्कोव्स्की

3
मुझे लगता है कि यद्यपि ओपी ने इस उत्तर को स्वीकार कर लिया था कि यह प्रश्न एकांत में था कि केवल एक युक्ति फ़ाइल का मूल्यांकन कैसे किया जाए: P
roberto tomás

4
इसका जवाब नहीं है। @iislucas का जवाब नीचे है।
बेन रेसिकॉट

क्या मैं अपने CI वातावरण में कुछ ध्वज स्थापित कर सकता हूं जो मुठभेड़ पर विफल होगा fdescribeया xdescribe? मैं एक टेढ़ा समीक्षक (मुझे) नहीं चाहता कि मैं एक पीआर का विलय करूं जो मेरे सभी परीक्षणों को समाप्त कर दे।
ILikeFood

80

test.tsफ़ाइल को srcफ़ोल्डर के अंदर कॉन्फ़िगर करें :

const context = require.context('./', true, /\.spec\.ts$/);

/\.spec\.ts$/उस फ़ाइल नाम से बदलें जिसे आप परीक्षण करना चाहते हैं। उदाहरण के लिए:/app.component\.spec\.ts$/

इसके लिए ही टेस्ट चलेगा app.component.spec.ts


8
उत्तर स्वीकार किया जाना चाहिए, यह दृष्टिकोण लॉग में gumpfy आउटपुट का भार हटाता है - फ़ेड्स के विपरीत जो क्रिया है
danday74

3
आसान समाधान :) बहुत समय बचाया।
डिटॉक्सिक-सोल

यह 'ऐप' से पहले कुछ भी घटकों के साथ मेल खाएगा इसलिए 'product-app.component.spec.ts' या 'order-app.component.spec.ts' भी एक मैच होगा। मैं रेक्स के साथ सबसे बड़ा नहीं हूं। क्या विशेष रूप से 'app.component.spec.ts' को लक्षित करने का एक तरीका है?
hanesjw

मैंने /^app.component\.spec\.ts$/ की कोशिश की, लेकिन कोई किस्मत नहीं। रेगेक्स परीक्षक में काम करने लगता है, लेकिन एनजी परीक्षण किसी कारण से इसे पसंद नहीं करता है; एक त्रुटि पैदा करता है।
hanesjw

अनुशंसित उत्तर होना चाहिए
अनिल वानगारी

55

आप केवल विशिष्ट फ़ाइल को इस तरह से कोणीय सीएलआई ( ngकमांड) के साथ परीक्षण कर सकते हैं :

ng test --main ./path/to/test.ts

आगे के डॉक्स https://angular.io/cli/test पर हैं

ध्यान दें कि जब यह स्टैंडअलोन लाइब्रेरी फ़ाइलों के लिए काम करता है, तो यह कोणीय घटकों / सेवाओं / आदि के लिए काम नहीं करेगा। ऐसा इसलिए है क्योंकि कोणीय फ़ाइलों में अन्य फ़ाइलों पर निर्भरता होती है (अर्थात् src/test.tsकोणीय 7 में)। अफसोस की बात यह है कि --mainझंडा कई तर्क नहीं देता है।


2
यह एक बेहतरीन सुझाव है और यह काम करता है। धन्यवाद! इसके अलावा इसके लायक होने के नाते कि अगर हम इसे एक ऑटो-जनरेटेड component.spec.tsफ़ाइल पर इंगित और इंगित करते हैं, तो हम देखेंगे कि परीक्षण कभी भी बंद नहीं होते हैं: Error: AsyncTestZoneSpec is needed for the async() test helper but could not be found. Please make sure that your environment includes zone.js/dist/async-test.js... मुझे यकीन है कि आगे वर्कअराउंड को एक साथ हैक किया जा सकता है, लेकिन यह जागरूक होना कुछ क्योंकि src/main.tsइस मामले में किया गया सेटअप और इसका आयात उपलब्ध नहीं है।
पुलकितसिंघल

जब मैं पूरे परीक्षण को कमांड ng tका उपयोग करके चलाता हूं जो मैं लिख रहा हूं, लेकिन जब मैं विशिष्ट फाइल चलाता हूं तो यह त्रुटि देता है। TypeError: TestBedViewEngine._initIfNeeded (नोड_modules/@angular/core/fesm2015/testing.js: 3112: 1) पर TestBedViewEngine.get (nang_angodules) पर null की संपत्ति 'getComponentFromError' नहीं पढ़ सकते। 3230: 1) फंक्शन.गेट (नोड_मॉडल /@angular/core/fesm2015/testing.js: 2960: 1) UserContext पर। <अनाम> (src / app / timebar.service.spec.ts: 14: 45) "।
कैनबक्स 9'19

1
यह उत्तर कोणीय 8 के लिए भी काम करता है। यह स्वीकृत उत्तर होना चाहिए क्योंकि यह वास्तव में एक परीक्षण युक्ति फ़ाइल चलाएगा।

2
कोणीय 9 के लिए मुझे अज्ञात विकल्प मिलता है "--मैन" :(
rmcsharry

6

यदि आप यह नियंत्रित करना चाहते हैं कि कमांड लाइन से कौन सी फाइलें चुनी गई हैं, तो मैं एंगुलर 7 के लिए ऐसा करने में कामयाब रहा।

सारांश में, आपको @angular-devkit/build-angular:browserपरीक्षण फ़ाइल regex पास करने के लिए एक कस्टम वेबपैक प्लगइन स्थापित करने और फिर बनाने की आवश्यकता है । उदाहरण के लिए:

angular.json - @angular-devkit/build-angular:browserकस्टम बिल्डर फ़ाइल से टेस्ट बिल्डर बदलें और सेट करें:

...

        "test": {
          "builder": "@angular-builders/custom-webpack:browser",
          "options": {
            "customWebpackConfig": {
              "path": "./extra-webpack.config.js"
            },
...

अतिरिक्त-webpack.config.js - कमांड लाइन से regex पढ़ता एक वेबपैक कॉन्फ़िगरेशन बनाएँ:

const webpack = require('webpack');
const FILTER = process.env.KARMA_FILTER;
let KARMA_SPEC_FILTER = '/.spec.ts$/';
if (FILTER) {
  KARMA_SPEC_FILTER = `/${FILTER}.spec.ts$/`;
}
module.exports = {
  plugins: [new webpack.DefinePlugin({KARMA_SPEC_FILTER})]
}

test.ts - युक्ति को संपादित करें

...
// Then we find all the tests.
declare const KARMA_CONTEXT_SPEC: any;
const context = require.context('./', true, KARMA_CONTEXT_SPEC);

फिर डिफ़ॉल्ट को ओवरराइड करने के लिए निम्नानुसार उपयोग करें:

KARMA_FILTER='somefile-.*\.spec\.ts$' npm run test

मैंने यहां बैकस्टोरी का दस्तावेजीकरण किया , प्रकार और गलत लिंक के लिए अग्रिम में माफी। मुझे सही दिशा में इंगित करने के लिए @ ऐश-अनु द्वारा उपरोक्त उत्तर का श्रेय।


4

यह मेरे लिए कोणीय 7. में काम कर रहा है। यह एनजी कमांड के विकल्प पर आधारित है। मुझे यकीन नहीं है कि यह विकल्प अनिर्दिष्ट है और संभवतः परिवर्तन के अधीन है, लेकिन यह मेरे लिए काम करता है। मैंने स्क्रिप्ट पैकेज सेक्शन में अपने पैकेज.जसन फ़ाइल में एक लाइन डाल दी। एनजी टेस्ट कमांड के साथ - मेन विकल्प का उपयोग करते हुए, मैं उस .spec.ts फ़ाइल को पथ निर्दिष्ट करता हूं जिसे मैं निष्पादित करना चाहता हूं। उदाहरण के लिए

"test 1": "ng test --main E:/WebRxAngularClient/src/app/test/shared/my-date-utils.spec.ts",

आप स्क्रिप्ट चला सकते हैं जैसे आप कोई भी स्क्रिप्ट चलाते हैं। मैं इसे वेबस्टॉर्म में npm अनुभाग में "परीक्षण 1" पर क्लिक करके चलाता हूं।


3

मैंने अपने लिए ग्रंट का उपयोग करके इस समस्या को हल किया। मेरे पास नीचे ग्रंट स्क्रिप्ट है। स्क्रिप्ट जो करती है वह विशिष्ट परीक्षण के कमांड लाइन पैरामीटर को चलाने के लिए ले जाती है और टेस्ट की एक प्रतिलिपि बनाता है और इस विशिष्ट परीक्षण नाम को वहां रखता है।

इसे चलाने के लिए, पहले ग्रंट-क्ली का उपयोग करके इंस्टॉल करें:

npm install -g grunt-cli

नीचे दिए गए ग्रन्ट निर्भरता को अपने पैकेज में रखें। json:

"grunt": "^1.0.1",
"grunt-contrib-clean": "^1.0.0",
"grunt-contrib-copy": "^1.0.0",
"grunt-exec": "^2.0.0",
"grunt-string-replace": "^1.3.1"

इसे चलाने के लिए नीचे दी गई ग्रन्ट फ़ाइल को अपने रूट फ़ोल्डर में Gruntfile.js के रूप में सहेजें। फिर कमांड लाइन से इसे इस प्रकार चलाएं:

grunt --target=app.component

यह app.component.spec.ts चलेगा।

ग्रन्ट फ़ाइल इस प्रकार है:

/*
This gruntfile is used to run a specific test in watch mode. Example: To run app.component.spec.ts , the Command is: 
grunt --target=app.component
Do not specific .spec.ts. If no target is specified it will run all tests.
*/
module.exports = function(grunt) {
var target = grunt.option('target') || '';
  // Project configuration.
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    clean: ['temp.conf.js','src/temp-test.ts'],
    copy: {
      main: {
        files: [
             {expand: false, cwd: '.', src: ['karma.conf.js'], dest: 'temp.conf.js'},
             {expand: false, cwd: '.', src: ['src/test.ts'], dest: 'src/temp-test.ts'}
             ],
      }
    },
    'string-replace': {
          dist: {
            files: {
              'temp.conf.js': 'temp.conf.js',
              'src/temp-test.ts': 'src/temp-test.ts'
            },
            options: {
              replacements: [{
                pattern: /test.ts/ig,
                replacement: 'temp-test.ts'
              },
              {
                pattern: /const context =.*/ig,
                replacement: 'const context = require.context(\'./\', true, /'+target+'\\\.spec\\\.ts$/);'
              }]
            }
        }
    },
    'exec': {
        sleep: {
          //The sleep command is needed here, else webpack compile fails since it seems like the files in the previous step were touched too recently
          command: 'ping 127.0.0.1 -n 4 > nul',
          stdout: true,
          stderr: true
        },
        ng_test: {
          command: 'ng test --config=temp.conf.js',
          stdout: true,
          stderr: true
        }
    }
  });

  // Load the plugin that provides the "uglify" task.
    grunt.loadNpmTasks('grunt-contrib-clean');
    grunt.loadNpmTasks('grunt-contrib-copy');
    grunt.loadNpmTasks('grunt-string-replace');
    grunt.loadNpmTasks('grunt-exec');
  // Default task(s).
  grunt.registerTask('default', ['clean','copy','string-replace','exec']);

};

स्वीकृत समाधान को देखते हुए, मुझे नहीं लगता कि इस तरह की सिफारिश की गई है
Drenai

2
@ ब्रायन - मेरा समाधान स्रोत कोड को संशोधित करने से बचता है और इसलिए फ़ाइल में जाँच में संभावित गलतियों को रोकता है। मेरा समाधान मैनुअल चरणों को स्वचालित करके कमांड लाइन पर परीक्षण नाम निर्दिष्ट करने में सक्षम बनाता है।
वनावल

हाँ, यह वास्तव में एक अच्छा बिंदु है। एक अच्छा मौका है कि आप xdescribe या fdescribe को हटाना भूल सकते हैं - और आपके परीक्षण को क्रमिक रूप से हटा दिया जाएगा!
डे्रनाई

3
@ आप tslint-jasmine-नियमों को स्थापित / कॉन्फ़िगर कर सकते हैं fdescribe / fit / xdescribe / xit कॉल की जाँच करें और अपने tslint रन को विफल करें; यदि यह एक पूर्व-कदम का हिस्सा है, तो यह आपको अपने परीक्षणों में आकस्मिक रूप से जाँचने से रोकता है या तो केंद्रित या अक्षम है।
नील मेन्ज़ीज़

1

मेरे जैसे लोगों के लिए इसे जोड़ना जो एंगुलर में एक ही युक्ति चलाने के लिए खोज रहे थे और यह एसओ मिला।

नवीनतम कोणीय डॉक्स (लेखन के समय v9.0.6) के अनुसार, ng testकमांड में एक --includeविकल्प होता है जहां आप *.spec.(ts|tsx)फाइलों की एक निर्देशिका या केवल एक फाइल को निर्दिष्ट कर सकते हैं .spec.(ts|tsx)

https://angular.io/cli/test


0

test.tsSrc फ़ोल्डर के अंदर फ़ाइल में बस छोटे बदलाव की जरूरत है :

const context = require.context('./', true, /test-example\.spec\.ts$/);

यहां, test-exampleसटीक फ़ाइल नाम है जिसे हमें चलाने की आवश्यकता है

उसी तरह, यदि आपको सेवा फ़ाइल का परीक्षण करने की आवश्यकता है, तो आप केवल "/test-example.sl" जैसे फ़ाइल नाम को बदल सकते हैं


0

यह मेरे लिए हर मामले में काम आया:

ng test --include='**/dealer.service.spec.ts'

हालाँकि, मुझे आमतौर पर इसके लिए "TypeError: नहीं पढ़ा जा सकता है 'संपत्ति' nullModule of null":

ng test --main src/app/services/dealer.service.spec.ts

@ कोणीय / सीएल का संस्करण 10.0.4

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.