জেসমিন জাভাস্ক্রিপ্ট টেস্টিং - টুএকএল বনাম টু বি


348

ধরা যাক আমার নিম্নলিখিত রয়েছে:

var myNumber = 5;
expect(myNumber).toBe(5);
expect(myNumber).toEqual(5);

উপরোক্ত দুটি পরীক্ষায় উত্তীর্ণ হবে। সংখ্যার মূল্যায়নের ক্ষেত্রে toBe()এবং এর মধ্যে কোনও পার্থক্য আছে কি toEqual()? যদি তাই হয়, আমার যখন অন্যটি ব্যবহার করা উচিত নয় তখন?


সংক্ষেপে: আদিমদের সাথে তুলনা করার সময় দুজনের মধ্যে কোনও পার্থক্য নেই; বস্তুর জন্য -> toEqual()কী / মান-সামগ্রী দ্বারা তুলনা করা হবে; toBe()বস্তুর রেফারেন্স দ্বারা তুলনা করা হবে।
আন্দ্রে এলরিকো

উত্তর:


488

আদিম ধরণের (যেমন সংখ্যা, বুলিয়ানস, স্ট্রিং ইত্যাদি) জন্য toBeএবং এর মধ্যে কোনও পার্থক্য নেই toEqual; হয় এক জন্য কাজ করবে 5, trueবা, "the cake is a lie"

মধ্যে পার্থক্য বুঝতে পারা toBeএবং toEqual, এর তিনটি বস্তু কল্পনা করা যাক।

var a = { bar: 'baz' },
    b = { foo: a },
    c = { foo: a };

একটি কঠোর তুলনা ( ===) ব্যবহার করে কিছু জিনিস "একই":

> b.foo.bar === c.foo.bar
true

> b.foo.bar === a.bar
true

> c.foo === b.foo
true

তবে কিছু জিনিস, যদিও তারা "সমান" হলেও তারা "সমান" নয়, কারণ তারা স্মৃতিতে বিভিন্ন স্থানে বসবাসকারী বস্তুর প্রতিনিধিত্ব করে।

> b === c
false

জেসমিনের toBeম্যাচারের সাথে কঠোর সমতার তুলনা করার জন্য মোড়ক ছাড়া আর কিছুই নয়

expect(c.foo).toBe(b.foo)

হিসাবে একই জিনিস

expect(c.foo === b.foo).toBe(true)

এর জন্য আমার কথাটি গ্রহণ করবেন না; টো বি এর উত্স কোডটি দেখুন ।

কিন্তু bএবং cকার্যত সমতুল্য বস্তুর প্রতিনিধিত্ব করে; তারা উভয় চেহারা

{ foo: { bar: 'baz' } }

এটা যদি আমরা যে বলতে পারে ভালো হবে না bএবং c"সমান" এমনকি যদি তারা একই বস্তুর প্রতিনিধিত্ব করে না কি?

প্রবেশ করুন toEqual, যা "গভীর সাম্যতা" পরীক্ষা করে (যেমন তাদের কীগুলির মান সমান কিনা তা নির্ধারণের জন্য বস্তুর মাধ্যমে পুনরাবৃত্তি অনুসন্ধান করে) search নিম্নলিখিত দুটি পরীক্ষা পাস করবে:

expect(b).not.toBe(c);
expect(b).toEqual(c);

আশা করি যা কিছু বিষয় পরিষ্কার করতে সহায়তা করে।


17
"আদিম ধরণের (যেমন সংখ্যা, বুলিয়ানস, স্ট্রিং ইত্যাদি) এর ক্ষেত্রে টো বি এবং টুএকুয়ালের মধ্যে কোনও পার্থক্য নেই" - এটি প্রমাণিত হিসাবে এটি সম্পূর্ণ সত্য নয়। expect(0).toBe(-0)পাস হবে কিন্তু expect(0).toEqual(-0)ব্যর্থ হবে।
মিগল

11
tl; dr - toBeকঠোর সাম্য ব্যবহার করে - রেফারেন্সের সাথে তুলনা করে, toEqualসম্পত্তি সমতা ব্যবহার করে। toEqual
আদিমদের

1
সুতরাং কোনটি আমাদের আদিমদের জন্য ব্যবহার করা উচিত এবং কেন? ড্রেনাই, আপনি কেন একালের প্রস্তাব দিচ্ছেন?
প্যাট্রিক জাজালাপস্কি

@PatrickSzalapski আমি শুধু Denai এর যুক্তি এ অনুমান করতে পারেন, কিন্তু toEqualসমতা (প্রায় আরো অনেক কিছু সতর্কতা অবলম্বন করা হয় 0 != -0, "hi" = new String("hi"),, ইত্যাদি) তাই আমি ব্যবহার করার প্রস্তাব চাই toEqual একচেটিয়াভাবে যদি না আপনি আসলে রেফারেন্স সমানতা সম্পর্কে উদ্বিগ্ন হয়েছে। সব চেক দেখুন toEqualতোলে eqপদ্ধতি এখানে: github.com/jasmine/jasmine/blob/master/src/core/matchers/...
নদী

আমি মনে করি টোকুয়েলে করা ওভারহেড সংরক্ষণ করার জন্য আদিমগুলির সাথে তুলনা করার সময় টো বি ব্যবহার করা ভাল।
গারফিল্ডক্লোন

81

toBe()বনাম toEqual(): toEqual()সমতা পরীক্ষা করে। toBe()অন্যদিকে, নিশ্চিত করে যে তারা ঠিক একই জিনিস।

আমি toBe()মানগুলির তুলনা করার সময় এবং toEqual()অবজেক্টগুলির সাথে তুলনা করার সময় ব্যবহার করব ।

যখন আদিম ধরণের তুলনা করা হয় toEqual()এবং toBe()একই ফল পাওয়া যাবে। বস্তুর toBe()তুলনা করার সময়, একটি কঠোর তুলনা করা হয় এবং এটি যদি মেমরির ক্ষেত্রে একই জিনিস না হয় তবে এটি মিথ্যা প্রত্যাবর্তন করবে। সুতরাং আপনি যদি এটি নিশ্চিত না করতে চান যে এটি মেমরিতে ঠিক একই জিনিস, toEqual()অবজেক্টের তুলনা করার জন্য ব্যবহার করুন ।

আরও তথ্যের জন্য এই লিঙ্কটি দেখুন: http://evanhahn.com/how-do-i-jasmine/

এখন যখন মধ্যে পার্থক্য দিকে তাকিয়ে toBe()এবং toEqual()যখন এটি নম্বর আসে, সেখানে কোনো পার্থক্য এতক্ষণ হিসাবে আপনার তুলনা সঠিক হওয়া উচিত নয়। 5সর্বদা সমান হবে 5

বিভিন্ন ফলাফল দেখতে এটির সাথে ঘুরে দেখার এক দুর্দান্ত জায়গা এখানে

হালনাগাদ

দেখার সহজ উপায় toBe()এবং toEqual()এটি জাভাস্ক্রিপ্টে ঠিক কী করে তা বোঝা। জেসমিন এপিআই অনুসারে, এখানে পাওয়া গেছে :

ToEqual () সাধারণ আক্ষরিক এবং পরিবর্তনশীলগুলির জন্য কাজ করে এবং অবজেক্টগুলির জন্য কাজ করা উচিত

টুবি () এর সাথে তুলনা করে ===

মূলত যা যা বলছে toEqual()এবং toBe()যা একই রকম জাভাস্ক্রিপ্ট ===অপারেটর রয়েছে তা বাদ দিয়ে toBe()নীচের উদাহরণের জন্য এটিও ঠিক একই বস্তু কিনা তা পরীক্ষা করে দেখানো হচ্ছে objectOne === objectTwo //returns false। তবে, toEqual()সেই পরিস্থিতিতে সত্য ফিরে আসবে।

যখন দেওয়া হয় তখন আপনি কমপক্ষে বুঝতে পারবেন:

var objectOne = {
    propertyOne: str,
    propertyTwo: num    
}

var objectTwo = {
    propertyOne: str,
    propertyTwo: num    
}

expect(objectOne).toBe(objectTwo); //returns false

অর্থাৎ কারণ যেমন বিবৃত , একটি ভিন্ন, কিন্তু অনুরূপ প্রশ্নের এই উত্তর=== অপারেটর আসলে দুটি অর্থ হয় operands রেফারেন্স যে একই বস্তু, বা মূল্য ধরনের ক্ষেত্রে, একই মান আছে।


4
এটি প্রশ্নের উত্তর দেওয়া এড়ানো যায়। আপনি toEqual()যে toEqual()সমতুল্যতা পরীক্ষা করে বলছেন তা ব্যাখ্যা করুন , তবে পরবর্তী প্রশ্নটি ঠিক আছে, সুতরাং "সমতুল্য" বলতে কী বোঝায়? "সমতুল্যতা" নির্ধারণ করতে ব্যবহৃত অ্যালগরিদমের বিবরণ বা এমন আচরণের ক্ষেত্রে toEqual()এবং toBe()পৃথক হওয়া ক্ষেত্রে অন্তত উদাহরণগুলি এটিকে আরও কার্যকর করে তোলে।
মার্ক আমেরিকা

8
এটি কেবল প্রশ্নের উত্তর দেয় না, তবে এটি ভুলtoEqualবস্তুর মধ্যে গভীর তুলনার জন্য ব্যবহার করা উচিত, না toBejsfiddle.net/bBL9P/67
লয়েড ব্যাংক

3
মনে হচ্ছে লোকেরা যা বলছে তা সঠিক কিনা তা পরীক্ষা করার জন্য বিরক্ত করছে না। টো বি এবং টুএকুয়াল উভয়ই কড়া তুলনা বলে মনে হচ্ছে। এটি পরীক্ষা করুন ... সুতরাং আমার পরীক্ষায় এখনও কোনও পার্থক্য খুঁজে পাওয়া যায়নি। উদাহরণস্বরূপ: var f = 1; Var ছ = "1" আশা (চ == ছ) .toEqual (সত্য); // সত্য আশা (চ) .toEqual (ছ); // মিথ্যা আশা (চ) .toBe (ছ); // মিথ্যা
user1809104

6
এটি সম্পূর্ণ ভুল। toEqualমোটেও একই রকম নয়==
মেগার

6
উপরের মন্তব্য পড়ুন। expect(1).toEqual('1')ব্যর্থ হয়, যদিও 1 == '1'সত্য। toEqualএর সাথে কিছু করার নেই ==। এটি ===ব্যতীত এটির সাথে বাই-মান তুলনার অনুরূপ কোনও উপায়ে তুলনা করবে except
মেগার

33

জুঁই গিথুব প্রকল্পটি উদ্ধৃত করতে,

expect(x).toEqual(y); বস্তু বা আদিম x এবং y এর তুলনা করে এবং তারা সমতুল্য হলে পাস করে

expect(x).toBe(y);বস্তু বা আদিম x এবং y এর তুলনা করে এবং যদি তারা একই বস্তু হয় তবে পাস করে


14

জেসমিন সোর্স কোডটি দেখে বিষয়টি আরও আলোকপাত করে।

toBeখুব সহজ এবং কেবল পরিচয় / কঠোর সাম্য অপারেটর ব্যবহার করে ===:

  function(actual, expected) {
    return {
      pass: actual === expected
    };
  }

toEqualঅন্যদিকে, প্রায় 150 লাইন দীর্ঘ এবং মত বস্তু সালে নির্মিত বিশেষ হ্যান্ডলিং হয়েছে String, Number, Boolean, Date, Error, Elementএবং RegExp। অন্যান্য বস্তুর জন্য এটি পুনরাবৃত্তভাবে বৈশিষ্ট্যের সাথে তুলনা করে।

এটি সাম্যতা অপারেটরের আচরণ থেকে খুব আলাদা ==। উদাহরণ স্বরূপ:

var simpleObject = {foo: 'bar'};
expect(simpleObject).toEqual({foo: 'bar'}); //true
simpleObject == {foo: 'bar'}; //false

var castableObject = {toString: function(){return 'bar'}};
expect(castableObject).toEqual('bar'); //false
castableObject == 'bar'; //true

2

toEqual()প্রিমিটিভ হলে মানগুলি বা অবজেক্টগুলির সাথে সামগ্রীগুলি তুলনা করে। toBe()রেফারেন্স তুলনা।

নিম্নলিখিত কোড / স্যুটটি স্ব-বর্ণনামূলক হতে হবে:

describe('Understanding toBe vs toEqual', () => {
  let obj1, obj2, obj3;

  beforeEach(() => {
    obj1 = {
      a: 1,
      b: 'some string',
      c: true
    };

    obj2 = {
      a: 1,
      b: 'some string',
      c: true
    };

    obj3 = obj1;
  });

  afterEach(() => {
    obj1 = null;
    obj2 = null;
    obj3 = null;
  });

  it('Obj1 === Obj2', () => {
    expect(obj1).toEqual(obj2);
  });

  it('Obj1 === Obj3', () => {
    expect(obj1).toEqual(obj3);
  });

  it('Obj1 !=> Obj2', () => {
    expect(obj1).not.toBe(obj2);
  });

  it('Obj1 ==> Obj3', () => {
    expect(obj1).toBe(obj3);
  });
});

1

ভেবেছেন কেউ উদাহরণ দিয়ে ব্যাখ্যাটি পছন্দ করতে পারে:

নীচে, যদি আমার ডিপক্লোন () ফাংশনটি সঠিকভাবে কাজ করে তবে পরীক্ষা ('এটি ()' কল বর্ণিত হিসাবে) সফল হবে:

describe('deepClone() array copy', ()=>{
    let source:any = {}
    let clone:any = source
    beforeAll(()=>{
        source.a = [1,'string literal',{x:10, obj:{y:4}}]
        clone = Utils.deepClone(source) // THE CLONING ACT TO BE TESTED - lets see it it does it right.
    })
    it('should create a clone which has unique identity, but equal values as the source object',()=>{
        expect(source !== clone).toBe(true) // If we have different object instances...
        expect(source).not.toBe(clone) // <= synonymous to the above. Will fail if: you remove the '.not', and if: the two being compared are indeed different objects.
        expect(source).toEqual(clone) // ...that hold same values, all tests will succeed.
    })
})

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


0

আমি মনে করি টুএকোয়াল গভীর সমান চেক করছে, টু বি একই ভেরিয়েবলের একই রেফারেন্স

  it('test me', () => {
    expect([] === []).toEqual(false) // true
    expect([] == []).toEqual(false) // true

    expect([]).toEqual([]); // true // deep check
    expect([]).toBe([]); // false
  })

-2

লক্ষ্য করার বিষয়গুলি:

  • toBe()কীভাবে হয় তার তুলনা আচরণ Object.is()করে।
  • toEqual()কীভাবে হয় তার তুলনা আচরণ ===করে।

এ কারণেই আদিম ধরণের জন্য toBeএবং toEqualসাম্যের জন্য পরীক্ষা করার সময় খুব বেশি পার্থক্য নেই, তবে বস্তুর মতো রেফারেন্সের ধরণের জন্য আপনি বরং toEqualসাম্যের জন্য পরীক্ষা করতে ব্যবহার করতে চাই d

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