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


196

কৌণিক 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. বেশিরভাগ বিকাশকারী বলছেন যে আপনি ব্যক্তিগত ফাংশন পরীক্ষা করবেন না তবে আমি বলি না যে সেগুলি ভুল বা সঠিক, তবে আমার ক্ষেত্রে প্রাইভেট পরীক্ষা করার প্রয়োজনীয়তা রয়েছে।


11
পরীক্ষাগুলি কেবলমাত্র জনসাধারণের ইন্টারফেসের পরীক্ষা করা উচিত, ব্যক্তিগত বাস্তবায়ন নয়। আপনি পাবলিক ইন্টারফেসে যে পরীক্ষাগুলি করেন তা ব্যক্তিগত অংশটিও কভার করা উচিত।
টস্কভ

16
আমি পছন্দ করি অর্ধেক উত্তরগুলি আসলে কীভাবে মন্তব্য করা উচিত। ওপি প্রশ্ন জিজ্ঞাসা, আপনি এক্স কিভাবে? গৃহীত উত্তর আসলে আপনাকে এক্স কীভাবে করতে হয় তা বলে Then এখানে কেবল জাভাস্ক্রিপ্ট সম্পর্কে কথা বলা) ব্যক্তিগত ফাংশন / পদ্ধতি পরীক্ষা করতে সক্ষম। কেন আমি জেএস জমিতে হারিয়ে গেছে বলে মনে হচ্ছে তা ব্যাখ্যা করার জন্য এগিয়ে যাব (দৃশ্যত অর্ধেক উত্তর দেওয়া হয়েছে)।
কোয়ার্টেরিয়ান

13
সমস্যা সমাধানের ব্যবস্থা করার পক্ষে এটি ভাল প্রোগ্রামিং অনুশীলন, সুতরাং "foo (x: টাইপ)" ফাংশনটি ব্যক্তিগত ফাংশনগুলিকে a (x: টাইপ), বি (x: টাইপ), সি (y: অন্য_প্রকার) এবং ডি কল করবে ( z- র: yet_another_type)। এখন foo, কলগুলি পরিচালনা করছে এবং স্টাফগুলি একসাথে রাখছে, এটি একটি স্রোতে পাথরের পিছনের দিকের মতো ছায়াছবি তৈরি করে যা ছায়াছবি যা সমস্ত ব্যাপ্তির পরীক্ষা করা নিশ্চিত করা সত্য। এর ফলে প্রতিটি রেঞ্জের উপ সেটটি বৈধ কিনা তা নিশ্চিত করা সহজ, যদি আপনি একা প্যারেন্ট "ফু" পরীক্ষা করার চেষ্টা করেন তবে ক্ষেত্রে পরিসীমা পরীক্ষাটি অত্যন্ত জটিল হয়ে ওঠে ।
কোয়ার্টেরিয়ান

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

5
আপনি যদি তাদের টিডিডি দিয়ে সঠিকভাবে পরীক্ষা করেন তবে আপনি পরে কী করছেন তা নির্ধারণ করার চেষ্টা করবেন না, যখন আপনার সঠিক পরীক্ষা করা উচিত ছিল।
কোয়ার্টেরিয়ান

উত্তর:


343

আমি আপনার সাথে রয়েছি, যদিও এটি "পাবলিক এপিআই কেবলমাত্র ইউনিট পরীক্ষা করার" পক্ষে একটি ভাল লক্ষ্য রয়েছে যখন এমন সময় আসে যখন এটিকে সহজ মনে হয় না এবং আপনি মনে করেন যে আপনি 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. আপনি anyঅ্যাক্সেস বিধিনিষেধ সম্পর্কে সতর্কতা থেকে সংকলককে দৃ and ়তা এবং পালাতে পারেন :

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

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

    (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

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

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

টাইপস্ক্রিপ্ট ২.6 এর জন্য সম্পাদনা করুন

কিছু পছন্দ মতো অন্য বিকল্পটি হ'ল // @ts-ignore( টিএস ২.6 এ যুক্ত ) যা নীচের লাইনে সমস্ত ত্রুটিগুলি কেবল দমন করে:

// @ts-ignore
thing._name = "Unit Test";

এটির সাথে সমস্যাটি হ'ল, এটি নীচের লাইনে সমস্ত ত্রুটিগুলি দমন করে:

// @ts-ignore
thing._name(123).this.should.NOT.beAllowed("but it is") = window / {};

আমি ব্যক্তিগতভাবে @ts-ignoreএকটি কোড-গন্ধ বিবেচনা করি এবং দস্তাবেজগুলি যেমন বলে:

আমরা আপনাকে এই মন্তব্যটি খুব অল্প পরিমাণে ব্যবহার করার পরামর্শ দিচ্ছি । [জোর মূল]


45
আপনার স্ট্যান্ডার্ড ইউনিট পরীক্ষক ডগমা পরিবর্তে একটি প্রকৃত সমাধানের সাথে ইউনিট পরীক্ষার বিষয়ে একটি বাস্তববাদী অবস্থান শুনে খুব ভাল লাগল।
d512

2
আচরণের কিছু "অফিসিয়াল" ব্যাখ্যা (যা এমনকি ইউনিট পরীক্ষাকে ব্যবহারের ক্ষেত্রে হিসাবে দেখায়
অ্যারন

1
নীচে উল্লিখিত হিসাবে কেবল ব্যবহার করুন // // টিএস-উপেক্ষা` ব্যক্তিগত অ্যাকসেসর উপেক্ষা করার Linter বলতে
Tommaso

1
@ টমাসো হ্যাঁ, এটি অন্য বিকল্প, তবে এটির ব্যবহারের একই অসুবিধা as any: আপনি সমস্ত প্রকারের পরীক্ষা-নিরীক্ষা হারাবেন।
অ্যারন বেল

2
সেরা উত্তর আমি কিছুক্ষণের মধ্যে দেখেছি, ধন্যবাদ @ অ্যারোনবিল। এবং এছাড়াও, মূল প্রশ্ন জিজ্ঞাসা করার জন্য ধন্যবাদ tymspy।
nicolas.leblanc

26

আপনি ব্যক্তিগত পদ্ধতি কল করতে পারেন । আপনি যদি নিম্নলিখিত ত্রুটির মুখোমুখি হন:

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

শুধু ব্যবহার করুন // @ts-ignore:

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

এই শীর্ষে থাকা উচিত!
jsnewbie

2
এটি অবশ্যই অন্য একটি বিকল্প। এটি একই সমস্যায় ভুগছে as anyযে আপনি কোনও টাইপ-চেকিং হারাচ্ছেন, আসলে আপনি পুরো লাইনে কোনও টাইপ-চেকিং হারাবেন।
অ্যারন বেল

19

যেহেতু বেশিরভাগ বিকাশকারীই ব্যক্তিগত ফাংশন পরীক্ষা করার পরামর্শ দেন না, কেন এটি পরীক্ষা করা হচ্ছে না?।

যেমন।

YourClass.ts

export class FooBar {
  private _status: number;

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

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

TestYourClass.spec.ts

describe("Testing foo bar for status being set", function() {

...

//Variable with type any
let fooBar;

fooBar = new FooBar();

...
//Method 1
//Now this will be visible
fooBar.initFooBar();

//Method 2
//This doesn't require variable with any type
fooBar['initFooBar'](); 
...
}

@ অ্যারন, @ থিরি টেম্প্লিয়ারকে ধন্যবাদ।


1
আমার মনে হয় আপনি ব্যক্তিগত / সুরক্ষিত পদ্ধতিতে কল করার চেষ্টা করলে টাইপসক্রিপটি প্রান্তিক ত্রুটি দেয়।
গুডগিপ

1
@ গুডগিপ এটি ধরণের ত্রুটি দেয় এবং সংকলন করে না। :)
tymspy

10

ব্যক্তিগত পদ্ধতিতে পরীক্ষা লিখবেন না 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. পরীক্ষার সহজ করার জন্য আপনার নিজের প্রশ্নের মধ্যে যুক্তিটি নিজের শ্রেণিতে স্থানান্তরিত করা উচিত।

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

1
এমন কোনও বস্তুর কল্পনা করুন যা আপনাকে 0 এবং ব্যক্তিগত সম্পত্তি x এর মধ্যে একটি এলোমেলো সংখ্যা দেয়। আপনি যদি জানতে চান যে কন্সট্রাক্টর দ্বারা x সঠিকভাবে সেট করা আছে তবে আপনি যে নম্বর পেয়েছেন তা সঠিক পরিসরে রয়েছে কিনা তা পরীক্ষা করার জন্য শত মান পরীক্ষা করার চেয়ে এক্স এর মান পরীক্ষা করা আরও সহজ is
গ্যাল্ডর

1
@ ব্যবহারকারী 25৩25২80০৫5 এটি বাস্তবায়নের পরীক্ষার উদাহরণ, আচরণ নয়। বেসরকারী নম্বরটি যেখান থেকে আসে তা আলাদা করে রাখা ভাল: একটি ধ্রুবক, একটি কনফিগার, কনস্ট্রাক্টর - এবং সেখান থেকে পরীক্ষা। যদি বেসরকারীটি অন্য কোনও উত্স থেকে না আসে তবে এটি "ম্যাজিক নম্বর" অ্যান্টিপ্যাটার্নে পড়ে।
মার্টিন

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

2
+1 টি। দুর্দান্ত উত্তর। @ টিমজেমস সঠিক অনুশীলনটি বলা বা ত্রুটিযুক্ত পদ্ধতির নির্দেশ করা এসও এর খুব উদ্দেশ্য। ওপি যা চায় তা অর্জন করার জন্য একটি হ্যাকি-ভঙ্গুর উপায় অনুসন্ধানের পরিবর্তে।
সৈয়দ আকিল আশিক

4

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

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


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

class OverlyComplicatedCalculator {
    public add(...numbers: number[]): number {
        return this.calculate((a, b) => a + b, numbers);
    }
    // can't be used or tested via ".calculate()", but it is still part of your public API!
    protected calculate(operation, operands) {
        let result = operands[0];
        for (let i = 1; i < operands.length; operands++) {
            result = operation(result, operands[i]);
        }
        return result;
    }
}

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

it('should be extensible via calculate()', () => {
    class TestCalculator extends OverlyComplicatedCalculator {
        public testWithArrays(array: any[]): any[] {
            const concat = (a, b) => [].concat(a, b);
            // tests the protected method
            return this.calculate(concat, array);
        }
    }
    let testCalc = new TestCalculator();
    let result = testCalc.testWithArrays([1, 'two', 3]);
    expect(result).toEqual([1, 'two', 3]);
});

3

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

পরিবর্তে:

sut.myPrivateMethod();

এই:

sut['myPrivateMethod']();

2

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

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

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

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

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

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

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

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

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


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);

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


1

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


সমাধান

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

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

উদাহরণ

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

https://patrickdesjardins.com/blog/how-to-unit-test-private-method-in-typescript-part-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(){
        // ...
    }
}

1

স্কয়ার বন্ধনী ব্যবহার করে ব্যক্তিগত পদ্ধতিতে কল করুন

টিএস ফাইল

class Calculate{
  private total;
  private add(a: number) {
      return a + total;
  }
}

দর্শনীয় ফাইল

it('should return 5 if input 3 and 2', () => {
    component['total'] = 2;
    let result = component['add'](3);
    expect(result).toEqual(5);
});

0

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

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

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

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

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

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


0

আমি যে পথটি নিয়েছি সেটি হল আমি ক্লাসের বাইরে ফাংশন তৈরি করি এবং আমার ব্যক্তিগত পদ্ধতিতে ফাংশনটি নির্ধারণ করি।

export class MyClass {
  private _myPrivateFunction = someFunctionThatCanBeTested;
}

function someFunctionThatCanBeTested() {
  //This Is Testable
}

আমি জানি না আমি কী ধরণের ওওপি নিয়ম ভঙ্গ করছি, তবে প্রশ্নের উত্তর দিতে আমি এইভাবে ব্যক্তিগত পদ্ধতি পরীক্ষা করি। আমি এর কারও পক্ষে পরামর্শ দেওয়ার জন্য স্বাগত জানাই।

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