কৌণিক-ক্লাইম দিয়ে কীভাবে কেবল একটি পরীক্ষার পরীক্ষা চালানো যায়


143

আমার Angular2 প্রকল্প বিল্ড রয়েছে Angular-CLI (বিটা 20) দিয়ে।

কেবলমাত্র একটি নির্বাচিত স্পেক ফাইলের বিরুদ্ধে পরীক্ষা চালানোর কোনও উপায় আছে?

আমি Angular2 দ্রুত শুরু করার ভিত্তিতে একটি প্রকল্প করতাম এবং আমি নিজেই জুঁই ফাইলে চশমা যুক্ত করতে পারি could তবে আমি জানি না এটি কীভাবে কর্ম পরীক্ষার বাইরে সেট আপ করতে হবে বা কীভাবে কুলার সিএলআই বিল্ডগুলি দিয়ে নির্দিষ্ট ফাইলগুলিতে কর্ম পরীক্ষা সীমাবদ্ধ করা যায়।

উত্তর:


224

আপনার প্রতিটি .spec.tsফাইলের এর সমস্ত পরীক্ষাগুলি describeএই জাতীয় ব্লকে ভাগ করা আছে :

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

আপনি সহজেই এই একক ব্লকটি describeসহ ফাংশনটির নামটি উপস্থাপন করে চালাতে পারেন f:

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

আপনার যদি এই জাতীয় ফাংশন থাকে তবে অন্য কোনও describeব্লক চলবে না। BTW। আপনি it=> এর সাথে একই জিনিস করতে পারেন fitএবং "ব্ল্যাকলিস্ট" সংস্করণও রয়েছে - x। তাই:

  • fdescribeএবং শুধুমাত্রfit কারণ চালানোর জন্য চিহ্নিত ফাংশনগুলির
  • xdescribeএবং xitকারণ সব কিন্তু ফাংশন চালানোর জন্য এই ভাবে চিহ্নিত

1
আমি আমার helloworld.componal.spec.ts ফাইলে এফডিসক্রাইব ব্যবহার করেছি তবে app.componal.spec.ts ফাইলের ত্রুটিগুলিও দেখানো হয়েছে।
মাস্টার যোদা

1
এটি কারণ সমস্ত কোড মূল্যায়ন করা হচ্ছে (অন্যথায় এটি আপনার পরীক্ষার মধ্যে fdescribe আছে তা জানেন না) - fdescribe কেবল পরীক্ষার ফলাফল কার্যকর করতে সীমাবদ্ধ করে। আপনার অন্য ফাইলগুলিতে সিনট্যাক্স / টাইপস্ক্রিপ্ট ত্রুটিগুলি ঠিক করতে হবে।
টোমেক সুকোভস্কি

3
আমি মনে করি যদিও ওপি এই উত্তরটি স্বীকার করেছে তবে প্রশ্নটি কীভাবে কেবল একটি নির্দিষ্ট ফাইলের মূল্যায়ন করতে পারে তা তাত্ক্ষণিকভাবে ছিল: পি
রবার্তো টমিস

4
এটি উত্তর নয়। @ আইস্লুকাসের নীচে উত্তর রয়েছে।
বেন র্যাকিকোট

আমি কি আমার সিআই পরিবেশে এমন কিছু পতাকা সেট করতে পারি যা মুখোমুখি হতে ব্যর্থ হবে 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
উত্তর গ্রহণ করা উচিত, এই পদ্ধতির লগগুলিতে একটি গাম্পি আউটপুটের একটি লোড সরিয়ে দেয় - fdescribe থেকে ভিন্ন যা verbose
danday74

3
সহজ সমাধান :) অনেক সময় সাশ্রয় করেছে।
ডিটক্সিক-সোল

এটি 'অ্যাপ' এর আগে 'প্রোডাক্ট-অ্যাপ.কম্পোনাল.স্পেক.সেটস' বা 'অর্ডার-অ্যাপ.কম.পোনাল.স্পেক.সেটস' এর আগে যে কোনও কিছুর সাথে উপাদানগুলির সাথে মিলবে also আমি রেজেক্স সহ সবচেয়ে বড় নই 'App.componal.spec.ts' নির্দিষ্টভাবে লক্ষ্য করার কোনও উপায় আছে কি?
হানেজডাব্লু

আমি /^app.componal\.spec\.ts$/ চেষ্টা করেছি তবে ভাগ্য নেই। একটি রেজেক্স টেস্টারে কাজ করার জন্য মনে হয় তবে এনজি টেস্ট কোনও কারণে এটি পছন্দ করে না; একটি ত্রুটি উত্পাদন করে।
হানেজডাব্লু

প্রস্তাবিত উত্তর হওয়া উচিত
অনিল ভঙ্গারি

55

আপনি কেবলমাত্র কৌনিক সিএলআই ( ngকমান্ড) দিয়ে নির্দিষ্ট ফাইলটি পরীক্ষা করতে পারেন :

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

আরও ডক্স https://angular.io/cli/test এ রয়েছে

মনে রাখবেন যে এটি স্বতন্ত্র গ্রন্থাগার ফাইলে কাজ করার সময় এটি কৌণিক উপাদান / পরিষেবা / ইত্যাদির জন্য কাজ করবে না। এটি কারণ কৌণিক ফাইলগুলির অন্যান্য ফাইলগুলির উপর নির্ভরতা থাকে ( src/test.tsযিনি কৌণিক in এ)। দুঃখের বিষয় --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এবং এর আমদানি এই ক্ষেত্রে উপলব্ধ নেই available
পুলকিতসিংহল

কমান্ডটি ব্যবহার করে যখন আমি পুরো পরীক্ষাগুলি চালিত করি তখন ng tপরীক্ষার জন্য আমি পাসটি লিখি but প্রকারের ত্রুটি: টেস্টবেডভিউজেইনিনে নালীর 'getComp घटकFromError' পড়তে পারে না _ 3230: 1) এ ইউজারকন্টেক্সটে ফাংশন.গেটে (নোড_মডিউলস /@angular/core/fesm2015/testing.js: 2960: 1) এ।
ক্যানব্যাক্স

1
এই উত্তরটি কৌনিক 8 এর জন্যও কাজ করে। এটি গ্রহণযোগ্য উত্তর হওয়া উচিত কারণ এটি ঠিক এক পরীক্ষার নির্দিষ্ট ফাইলটি চলবে।

2
কৌণিক 9 এর জন্য আমি অজানা বিকল্প "
মেইন

6

কমান্ড লাইন থেকে কোন ফাইল নির্বাচন করা হয়েছে তা আপনি যদি নিয়ন্ত্রণ করতে সক্ষম হতে চান তবে আমি কৌনিক 7 এর জন্য এটি করতে পেরেছি।

সংক্ষেপে, আপনাকে ইনস্টল করতে হবে @angular-devkit/build-angular:browserএবং তারপরে পরীক্ষার ফাইলের রেজেক্স পাস করার জন্য একটি কাস্টম ওয়েবপ্যাক প্লাগইন তৈরি করতে হবে। উদাহরণ স্বরূপ:

কৌণিক.জসন - পরীক্ষা নির্মাতা থেকে পরিবর্তন করুন @angular-devkit/build-angular:browserএবং একটি কাস্টম কনফিগার ফাইল সেট করুন:

...

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

অতিরিক্ত- webpack.config.js - একটি ওয়েবপ্যাক কনফিগারেশন তৈরি করুন যা কমান্ড লাইন থেকে রেজেক্স পড়বে:

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.. এ কাজ করছে এটি এনজি কমান্ডের --main বিকল্পের উপর ভিত্তি করে। আমি নিশ্চিত নই যে এই বিকল্পটি অনিবন্ধিত এবং সম্ভবত পরিবর্তিত হতে পারে তবে এটি আমার পক্ষে কাজ করে। আমি আমার প্যাকেজ.জসন ফাইলটিতে স্ক্রিপ্ট বিভাগে একটি লাইন রেখেছি। এনজি টেস্ট কমান্ডের সাথে --main বিকল্পটি ব্যবহার করে, আমি .spec.ts ফাইলের যে পথটি চালাতে চাই তার জন্য পথটি নির্দিষ্ট করেছি। উদাহরণ স্বরূপ

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

আপনি যেমন কোনও স্ক্রিপ্ট চালানোর সাথে সাথে স্ক্রিপ্টটি চালাতে পারেন। আমি এনপিএম বিভাগে "পরীক্ষা 1" এ ক্লিক করে এটি ওয়েবস্টর্মে চালাচ্ছি।


3

আমি গ্রান্ট ব্যবহার করে নিজের জন্য এই সমস্যাটি সমাধান করেছি। আমার নীচে গ্রুর্ট স্ক্রিপ্ট রয়েছে। স্ক্রিপ্টটি যা করে তা হ'ল নির্দিষ্ট পরীক্ষার কমান্ড লাইন প্যারামিটারটি চালানোর জন্য নেয় এবং টেস্ট.সটির একটি অনুলিপি তৈরি করে এবং এই নির্দিষ্ট পরীক্ষার নামটিকে সেখানে রাখে।

এটি চালানোর জন্য, প্রথমে গ্রুর্ট-ক্লিপ ইনস্টল করুন:

npm install -g grunt-cli

আপনার প্যাকেজ.জসনে নীচে গ্রুর্ট নির্ভরতা রাখুন:

"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"

এটি চালানোর জন্য নীচের গ্রান্ট ফাইলটি আপনার রুট ফোল্ডারে গ্রান্টফিল.জেএস হিসাবে সংরক্ষণ করুন। তারপরে কমান্ড লাইন থেকে এটি চালান:

grunt --target=app.component

এটি app.componal.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']);

};

গৃহীত সমাধানটির দিকে তাকিয়ে, আমি মনে করি না যে এইভাবে প্রস্তাবিত
ড্রেনাই

2
@ ব্রায়ান - আমার সমাধান উত্স কোডটি সংশোধন করা এড়াতে পারে এবং তাই ফাইলটিতে পরীক্ষা করার ক্ষেত্রে সম্ভাব্য ভুলগুলি প্রতিরোধ করে। আমার সমাধানটি ম্যানুয়াল পদক্ষেপগুলি স্বয়ংক্রিয় করে কমান্ড লাইনে পরীক্ষার নামটি সুনির্দিষ্ট করে সক্ষম করে।
ভ্যানভাল

হ্যাঁ, এটি আসলে একটি ভাল পয়েন্ট। Xdescribe বা fdes সাবস্ক্রাইব অপসারণ করতে ভুলে যেতে পারে এমন একটি ভাল সুযোগ রয়েছে - এবং আপনার পরীক্ষা স্থায়ীভাবে মুছে ফেলা হবে!
ড্রেনাই

3
@ রায়ান আপনি fdescribe / ফিট / xdescribe / xit কলগুলি পরীক্ষা করতে এবং tslint চালাতে ব্যর্থ হয়ে tslint-jasmine-নিয়মগুলি কনফিগার করতে পারেন; যদি এটি পূর্ববর্তী পদক্ষেপের অংশ হয় তবে এটি দুর্ঘটনাক্রমে আপনার পরীক্ষাগুলিতে দৃষ্টি নিবদ্ধ করা বা অক্ষম হওয়া থেকে বিরত রাখতে বাধা দেয়।
নিল মেন্জিস

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.service" এর মতো ফাইলের নাম প্রতিস্থাপন করতে পারেন can


0

এটি প্রতিটি ক্ষেত্রেই আমার পক্ষে কাজ করেছে:

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

যাইহোক, আমি সাধারণত "টাইপএরর: এর জন্য নালীর সম্পত্তি 'এনজিমডিউল' পড়তে পারি না":

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

@ কৌণিক / ক্লিপ এর সংস্করণ 10.0.4

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.