angular - জেসমিনের সাথে ব্যক্তিগত পদ্ধতির জন্য কৌনিক/টাইপস্ক্রিপ্টের জন্য ইউনিট টেস্টিং কীভাবে লিখবেন



unit-testing typescript (7)

"ব্যক্তিগত পদ্ধতি পরীক্ষা করবেন না" এর বিন্দুটি হ'ল ক্লাসটি এমন কেউ ব্যবহার করে যেমন এটি ব্যবহার করে Test

আপনার যদি 5 টি পদ্ধতি সহ সর্বজনীন এপিআই থাকে তবে আপনার শ্রেণীর যে কোনও গ্রাহক এগুলি ব্যবহার করতে পারবেন এবং তাই আপনার এগুলি পরীক্ষা করা উচিত। গ্রাহকের আপনার শ্রেণীর ব্যক্তিগত পদ্ধতি / বৈশিষ্ট্য অ্যাক্সেস করা উচিত নয়, এর অর্থ জনসাধারণের উন্মুক্ত কার্যকারিতা একই থাকলে আপনি ব্যক্তিগত সদস্যদের পরিবর্তন করতে পারবেন।

যদি আপনি অভ্যন্তরীণ এক্সটেনসিবল কার্যকারিতার উপর নির্ভর করেন তবে private পরিবর্তে protected ব্যবহার করুন।
নোট করুন যে protected এখনও একটি সর্বজনীন API (!) , সবেমাত্র ভিন্নভাবে ব্যবহৃত হয় used

expect(new FooBar(/*...*/).initFooBar()).toEqual(/*...*/);
// TS2341: Property 'initFooBar' is private and only accessible within class 'FooBar'

ইউনিট টেস্ট সুরক্ষিত বৈশিষ্ট্যগুলি একই উপায়ে কোনও গ্রাহক তাদের সাবক্লাসিংয়ের মাধ্যমে ব্যবহার করবে:

// @ts-ignore
expect(new FooBar(/*...*/).initFooBar()).toEqual(/*...*/);

https://src-bin.com

কৌণিক 2 তে আপনি কীভাবে একটি ব্যক্তিগত ফাংশন পরীক্ষা করেন?

class FooBar {

    private _status: number;

    constructor( private foo : Bar ) {
        this.initFooBar();

    }

    private initFooBar(){
        this.foo.bar( "data" );
        this._status = this.fooo.foo();
    }

    public get status(){
        return this._status;
    }

}

সমাধান আমি খুঁজে পেয়েছি

  1. পরীক্ষার কোডটি নিজেই ক্লোজারের ভিতরে রাখুন বা ক্লোজারের অভ্যন্তরে কোড যুক্ত করুন যা বাইরের স্কোপে বিদ্যমান বস্তুর উপর স্থানীয় ভেরিয়েবলের রেফারেন্স সঞ্চয় করে।

    পরে কোনও সরঞ্জাম ব্যবহার করে পরীক্ষার কোডটি সরিয়ে ফেলুন। http://philipwalton.com/articles/how-to-unit-test-private-functions-in-javascript/

আপনি যদি কিছু করে থাকেন তবে দয়া করে আমাকে এই সমস্যার সমাধানের আরও ভাল উপায়ের পরামর্শ দিন?

দ্রষ্টব্য

  1. এই জাতীয় অনুরূপ প্রশ্নের বেশিরভাগ উত্তর সমস্যার সমাধান দেয় না, এজন্যই আমি এই প্রশ্নটি জিজ্ঞাসা করছি

  2. বেশিরভাগ বিকাশকারী বলছেন যে আপনি ব্যক্তিগত ফাংশন পরীক্ষা করবেন না তবে আমি বলি না যে সেগুলি ভুল বা সঠিক, তবে আমার ক্ষেত্রে প্রাইভেট পরীক্ষা করার প্রয়োজনীয়তা রয়েছে।


Answer #1

অনেকে ইতিমধ্যে জানিয়েছে, আপনি ব্যক্তিগত পদ্ধতিগুলি যতটা পরীক্ষা করতে চান সেটিকে আপনার কাজ করতে আপনার কোড বা ট্রান্সপোর্টার হ্যাক করা উচিত নয়। আধুনিক দিনের টাইপস্ক্রিপ্ট লোকেরা এ পর্যন্ত সরবরাহ করেছে এমন বেশিরভাগ হ্যাককে অস্বীকার করবে।

সমাধান

টিএলডিআর ; যদি কোনও পদ্ধতির পরীক্ষা করা উচিত তবে আপনার কোডটি কোনও শ্রেণিতে বিঘ্নিত করা উচিত যা আপনি পরীক্ষার জন্য পদ্ধতিটি জনসমক্ষে প্রকাশ করতে পারবেন।

আপনার পদ্ধতিটি ব্যক্তিগত থাকার কারণটি হ'ল কারণ কার্যকারিতাটি অগত্যা সেই শ্রেণীর দ্বারা প্রকাশ করা উচিত নয় এবং তাই যদি কার্যকারিতাটি সেখানে না থাকে তবে এটি তার নিজস্ব শ্রেণিতে ডিক্লুপ করা উচিত।

উদাহরণ

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

https://patrickdesjardins.com/blog/how-to-unit-test-private-method-in-typescript-part-2

দ্রষ্টব্য : এই কোডটি উপরে লিঙ্ক করা ব্লগ থেকে তোলা হয়েছে (লিঙ্কটির পিছনে থাকা সামগ্রীর পরিবর্তনের ক্ষেত্রে আমি নকল করছি)

আগে
export class FooBar {
  private _status: number;

  constructor( private foo : Bar ) {
    this.initFooBar({});
  }

  private initFooBar(data){
    this.foo.bar( data );
    this._status = this.foo.foo();
  }
}
পরে
(function(System) {(function(__moduleName){System.register([], function(exports_1, context_1) {
  "use strict";
  var __moduleName = context_1 && context_1.id;
  var FooBar;
  return {
    setters:[],
    execute: function() {
      FooBar = (function () {
        function FooBar(foo) {
          this.foo = foo;
          this.initFooBar({});
        }
        FooBar.prototype.initFooBar = function (data) {
          this.foo.bar(data);
          this._status = this.foo.foo();
        };
        return FooBar;
      }());
      exports_1("FooBar", FooBar);
    }
  }
})(System);

Answer #2

আমি @ টসকভের সাথে একমত: আমি এটি করার সুপারিশ করব না :-)

তবে আপনি যদি সত্যিই আপনার ব্যক্তিগত পদ্ধতিটি পরীক্ষা করতে চান তবে আপনি সচেতন হতে পারেন যে টাইপস্ক্রিপ্টের জন্য সংশ্লিষ্ট কোডটি কনস্ট্রাক্টর ফাংশন প্রোটোটাইপের একটি পদ্ধতির সাথে মিলে যায়। এর অর্থ এটি রানটাইমে ব্যবহার করা যেতে পারে (যেখানে আপনার সম্ভবত কিছু সংকলনের ত্রুটি থাকবে)।

উদাহরণ স্বরূপ:

class User{
    public getUserInformationToDisplay(){
        //...
        this.getUserAddress();
        //...
    }

    private getUserAddress(){
        //...
        this.formatStreet();
        //...
    }
    private formatStreet(){
        //...
    }
}

এতে স্থানান্তরিত হবে:

class User{
    private address:Address;
    public getUserInformationToDisplay(){
        //...
        address.getUserAddress();
        //...
    }
}
class Address{
    private format: StreetFormatter;
    public format(){
        //...
        format.ToString();
        //...
    }
}
class StreetFormatter{
    public toString(){
        // ...
    }
}

এই plunkr দেখুন: https://plnkr.co/edit/calJCF?p=preview পূর্বরূপ দেখুন।


Answer #3

আমি আপনার সাথে রয়েছি, যদিও "একমাত্র ইউনিট পাবলিক এপিআই পরীক্ষা" করার পক্ষে এটি বেশ ভাল সময় যখন এটি সহজ মনে হয় না এবং আপনি মনে করেন যে আপনি API বা ইউনিট-পরীক্ষার মধ্যে আপোষের মধ্যে বেছে নিচ্ছেন। আপনি এটি ইতিমধ্যে জানেন, যেহেতু আপনি যা করতে বলছেন ঠিক তাই আমি এতে প্রবেশ করব না। :)

টাইপস্ক্রিপ্টে আমি একক-পরীক্ষার স্বার্থে আপনি ব্যক্তিগত সদস্যদের অ্যাক্সেস করতে পারেন এমন কয়েকটি উপায় আবিষ্কার করেছেন। এই শ্রেণি বিবেচনা করুন:

class MyThing {

    private _name:string;
    private _count:number;

    constructor() {
        this.init("Test", 123);
    }

    private init(name:string, count:number){
        this._name = name;
        this._count = count;
    }

    public get name(){ return this._name; }

    public get count(){ return this._count; }

}

যদিও টিএস private , protected , public ব্যবহার করে শ্রেণীর সদস্যদের অ্যাক্সেসকে সীমাবদ্ধ করে, সংকলিত জেএসের কোনও ব্যক্তিগত সদস্য নেই, যেহেতু এটি জেএস-এ কোনও জিনিস নয়। এটি নিখুঁতভাবে টিএস সংকলকের জন্য ব্যবহৃত হয়েছে। অতএব:

  1. আপনি যে কোনওটির প্রতি দৃ and়তা রাখতে এবং অ্যাক্সেস বিধিনিষেধ সম্পর্কে আপনাকে সতর্ক করার থেকে সংকলকটি পালাতে পারেন:

    (thing as any)._name = "Unit Test";
    (thing as any)._count = 123;
    (thing as any).init("Unit Test", 123);

    এই পদ্ধতির সমস্যাটি হ'ল সংকলকটির কেবল কোনওটির সঠিক কী করা হচ্ছে তা সম্পর্কে কোনও ধারণা নেই, সুতরাং আপনি পছন্দসই ধরণের ত্রুটিগুলি পান না:

    (thing as any)._name = 123; // wrong, but no error
    (thing as any)._count = "Unit Test"; // wrong, but no error
    (thing as any).init(0, "123"); // wrong, but no error
  2. আপনি ব্যক্তিগত সদস্যদের পেতে অ্যারে অ্যাক্সেস ( [] ) ব্যবহার করতে পারেন:

    thing["_name"] = "Unit Test";
    thing["_count"] = 123;
    thing["init"]("Unit Test", 123);

    এটি চমত্কার দেখানোর সময়, টিএসসি আসলে প্রকারগুলিকে বৈধতা দেবে যেন আপনি সেগুলিতে সরাসরি অ্যাক্সেস করেছেন:

    thing["_name"] = 123; // type error
    thing["_count"] = "Unit Test"; // type error
    thing["init"](0, "123"); // argument error

    সত্যি বলতে কী আমি জানি না কেন এটি কাজ করে। প্রকারগত সুরক্ষা না হারিয়ে ব্যক্তিগত সদস্যদের অ্যাক্সেস দেওয়ার জন্য এটি সম্ভবত একটি ইচ্ছাকৃত "এস্কেপ হ্যাচ" । আপনার ইউনিট-পরীক্ষার জন্য আপনি যা চান তা হ'ল এটি।

টাইপস্ক্রিপ্ট প্লেগ্রাউন্ডে একটি কার্যকারী উদাহরণ এখানে।


Answer #4

এই পোস্টে নেক্রোর জন্য দুঃখিত, তবে আমি দু'টি বিষয় যা আপনার কাছে স্পর্শ করা হয়নি বলে মনে হয় তা করতে বাধ্য হতে পারি been

প্রথম সর্বাগ্রে - যখন আমরা ইউনিট পরীক্ষার সময় কোনও শ্রেণিতে ব্যক্তিগত সদস্যদের অ্যাক্সেসের প্রয়োজন মনে করি, তখন এটি সাধারণত একটি বড়, চর্বিযুক্ত লাল পতাকা যা আমরা আমাদের কৌশলগত বা কৌশলগত পদ্ধতির দিকে অগ্রাহ্য করেছি এবং অজান্তে একাকী দায়িত্ব অধ্যক্ষকে লঙ্ঘন করে লঙ্ঘন করেছি আচরণ যেখানে এটি সম্পর্কিত নয়। এমন কোনও পদ্ধতির অ্যাক্সেসের প্রয়োজনীয়তা অনুভব করা যা কোনও নির্মাণ পদ্ধতির বিচ্ছিন্ন সাববুটিন ছাড়া সত্যই আর কিছু নয়; এটি এর অন্যতম সাধারণ ঘটনা; যাইহোক, এটি এমন এক ধরণের আপনার বসের প্রত্যাশার মতো যে আপনি প্রস্তুত কাজ করার জন্য প্রস্তুত থাকবেন এবং আপনাকে সেই অবস্থায় প্রবেশের জন্য আপনি কী ভোরের রুটিনটি পেরেছিলেন তা কিছু বিভ্রান্তিকর প্রয়োজনও জানতে হবে ...

এই ঘটনার অন্য সবচেয়ে সাধারণ উদাহরণটি হল আপনি যখন নিজেকে প্রবাদকোষটি "গড ক্লাস" পরীক্ষা করার চেষ্টা করছেন। এটি নিজের মধ্যে এবং নিজেই একটি বিশেষ ধরণের সমস্যা, তবে কোনও পদ্ধতির অন্তরঙ্গ বিবরণ জানা প্রয়োজন সহ একই বুনিয়াদি সমস্যাটি ভোগ করে - তবে বিষয়টি বন্ধ হয়ে যায়।

এই সুনির্দিষ্ট উদাহরণে, আমরা কার্যকরভাবে FooBar বর্গের নির্মাতার কাছে বার অবজেক্টটি সম্পূর্ণরূপে আরম্ভ করার দায়িত্ব অর্পণ করেছি। অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং-এর মূল ভাড়াটেগুলির মধ্যে একটি হ'ল নির্মাতা "পবিত্র" এবং অবৈধ তথ্য থেকে রক্ষা করা উচিত যা এটির নিজস্ব অভ্যন্তরীণ অবস্থাকে অকার্যকর করে রাখবে এবং এটিকে অন্য প্রান্তে প্রবাহিত করতে ব্যর্থ করে দেবে (কোনটি খুব গভীর হতে পারে) পাইপলাইন।)

আমরা এখানে ব্যর্থ হয়েছি FooBar অবজেক্টটি এমন একটি বারকে মেনে নেওয়ার অনুমতি দিয়ে যা FooBar নির্মাণের সময় প্রস্তুত নয়, এবং FooBar অবজেক্টকে সাজানোর ধরণের দ্বারা ক্ষতিপূরণ দিয়েছি বিষয়গুলিকে তার নিজস্ব হিসাবে গ্রহণ করার জন্য হাত।

এটি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের অন্য ভাড়াটে (বারের ক্ষেত্রে) মেনে চলা ব্যর্থতার ফলস্বরূপ যা কোনও বস্তুর রাজ্য সম্পূর্ণরূপে শুরু করা উচিত এবং তৈরির সাথে সাথে তার জনসাধারণের কাছে যে কোনও আগত কলগুলি পরিচালনা করতে প্রস্তুত থাকতে হবে। এখন, এর অর্থ এই নয় যে কনস্ট্রাক্টরকে সমস্ত পরিস্থিতিতে ডাকা হওয়ার সাথে সাথেই। যখন আপনার কাছে এমন কোনও অবজেক্ট রয়েছে যার অনেকগুলি জটিল নির্মাণের পরিস্থিতি রয়েছে, তারপরে কোনও বিকল্প নকশা-প্যাটার্ন (কারখানা, বিল্ডার, ইত্যাদি ...) অনুসারে কার্যকর করা কোনও বস্তুতে তার বিকল্প বিকল্প সদস্যদের কাছে সেটটারগুলি প্রকাশ করা ভাল of পরবর্তী ক্ষেত্রে, আপনি লক্ষ্য বস্তুর সূচনাটি অন্য কোনও অবজেক্টের গ্রাফের দিকে ঠেলে দিচ্ছেন যার একমাত্র উদ্দেশ্য ট্র্যাফিককে এমন একটি পয়েন্টে নিয়ে যাওয়ার দিকে পরিচালিত করছে যেখানে আপনি যে অনুরোধ করছেন তার বৈধ উদাহরণ রয়েছে - এবং পণ্যটি এমনটি হওয়া উচিত নয় এই তৈরির অবজেক্টটি এটি পরিবেশন না করা অবধি "প্রস্তুত" হিসাবে বিবেচিত।

আপনার উদাহরণে, বারের "স্ট্যাটাস" বৈশিষ্ট্যটি কোনও বৈধ অবস্থায় নেই বলে মনে হয় না যেখানে কোনও ফুবার এটি গ্রহণ করতে পারে - সুতরাং সমস্যাটি সংশোধন করার জন্য ফুবার তার সাথে কিছু করে।

দ্বিতীয় যে বিষয়টি আমি দেখছি তা হ'ল এটি প্রদর্শিত হয় যে আপনি পরীক্ষা-চালিত বিকাশের পরিবর্তে আপনার কোডটি পরীক্ষা করার চেষ্টা করছেন। এটি সময়ে এই সময়ে অবশ্যই আমার নিজস্ব মতামত; তবে, এই ধরণের পরীক্ষা করা সত্যিই একটি অ্যান্টি-প্যাটার্ন। আপনি যে কাজটি শেষ করছেন তা বুঝতে পেরে আপনার মূল নকশার সমস্যা রয়েছে যা আপনার কোডটি সত্যতার পরে পরীক্ষামূলক হওয়ার থেকে বিরত রাখে, আপনার প্রয়োজনীয় পরীক্ষাগুলি লেখার চেয়ে এবং পরবর্তীতে পরীক্ষাগুলিতে প্রোগ্রামিংয়ের চেয়ে। যেভাবেই আপনি সমস্যার মুখোমুখি হন, আপনি এখনও একই সংখ্যক পরীক্ষার এবং কোডের লাইনগুলি দিয়ে শেষ করতে পারেন যদি আপনি সত্যই একটি সলিড বাস্তবায়ন অর্জন করেছিলেন। সুতরাং - কেন আপনি চেষ্টা করতে পারেন এবং পরীক্ষারযোগ্য কোডের দিকে প্রকৌশলীকে কেন আপনার বিপরীতমুখী প্রচেষ্টা শুরু করার সাথে সাথে বিষয়টি ঠিক সমাধান করতে পারেন?

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


Answer #5

ব্যক্তিগত পদ্ধতিতে পরীক্ষা লিখবেন না write এটি ইউনিট পরীক্ষার পয়েন্টকে পরাস্ত করে।

  • আপনার ক্লাসের সর্বজনীন এপিআই পরীক্ষা করা উচিত
  • আপনার ক্লাসের ইমপ্লিমেন্টেশন বিশদটি পরীক্ষা করা উচিত নয়

উদাহরণ

class SomeClass {

  public addNumber(a: number, b: number) {
      return a + b;
  }
}

পরে যদি বাস্তবায়ন পরিবর্তন হয় তবে এই পদ্ধতির পরীক্ষার পরিবর্তনের প্রয়োজন হবে না তবে পাবলিক এপিআইয়ের behaviour একই থাকে।

class SomeClass {

  public addNumber(a: number, b: number) {
      return this.add(a, b);
  }

  private add(a: number, b: number) {
       return a + b;
  }
}

পদ্ধতিগুলি এবং বৈশিষ্ট্যগুলি কেবলমাত্র তাদের পরীক্ষা করার জন্য সর্বজনীন করবেন না। এর অর্থ সাধারণত:

  1. আপনি এপিআই (পাবলিক ইন্টারফেস) না দিয়ে বাস্তবায়ন পরীক্ষা করার চেষ্টা করছেন।
  2. পরীক্ষার সহজ করার জন্য আপনার নিজের প্রশ্নের মধ্যে যুক্তিটি নিজের শ্রেণিতে স্থানান্তরিত করা উচিত।

Answer #6

হারুনের উত্তরটি সেরা এবং আমার পক্ষে কাজ করছে :) আমি এটিকে ভোট দিয়ে যাব তবে দুঃখের সাথে আমি (সুনাম অনুপস্থিত) পারি না।

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

উদাহরণ স্বরূপ:

class Something {
  save(){
    const data = this.getAllUserData()
    if (this.validate(data))
      this.sendRequest(data)
  }
  private getAllUserData () {...}
  private validate(data) {...}
  private sendRequest(data) {...}
}

এই সমস্ত পদ্ধতি একবারে না পরীক্ষা করা আমাদের পক্ষে প্রচুর পরিমাণে জ্ঞান লাভ করে কারণ আমাদের সেই ব্যক্তিগত পদ্ধতিগুলি উপহাস করতে হবে, যা আমরা উপহাস করতে পারি না কারণ আমরা সেগুলি অ্যাক্সেস করতে পারি না। এর অর্থ সামগ্রিকভাবে এটি পরীক্ষা করতে আমাদের একক পরীক্ষার জন্য প্রচুর কনফিগারেশন প্রয়োজন।

এটি বলেছে যে সমস্ত নির্ভরতার সাথে উপরের পদ্ধতিটি পরীক্ষা করার সর্বোত্তম উপায় পরীক্ষা শেষের সমাপ্তি, কারণ এখানে একটি সংহতকরণ পরীক্ষা প্রয়োজন, তবে আপনি টিডিডি (টেস্ট চালিত বিকাশ) অনুশীলন করলে E2E পরীক্ষা আপনাকে সাহায্য করবে না, তবে পরীক্ষা করছে যে কোন পদ্ধতি।





jasmine