चमेली में वस्तु समानता की जाँच करना


85

जैस्मीन में अंतर्निहित मैचर्स toBeऔर हैं toEqual। अगर मेरे पास इस तरह की कोई वस्तु है:

function Money(amount, currency){
    this.amount = amount;
    this.currency = currency;

    this.sum = function (money){
        return new Money(200, "USD");
    }
}

और new Money(200, "USD")योग की तुलना और परिणाम की कोशिश करें , ये अंतर्निहित मिलान अपेक्षा के अनुरूप काम नहीं करेंगे। मैं एक कस्टम equalsविधि और कस्टम मिलान के आधार पर एक काम के आसपास को लागू करने में कामयाब रहा , लेकिन यह सिर्फ बहुत काम लगता है।

जैस्मीन में वस्तुओं की तुलना करने का मानक तरीका क्या है?

जवाबों:


172

मैं एक ही चीज की तलाश में था और बिना किसी कस्टम कोड या मैचर्स के ऐसा करने का मौजूदा तरीका पाया। का उपयोग करें toEqual()


63

यदि आप आंशिक वस्तुओं की तुलना करना चाहते हैं, तो आप इस पर विचार कर सकते हैं:

describe("jasmine.objectContaining", function() {
  var foo;

  beforeEach(function() {
    foo = {
      a: 1,
      b: 2,
      bar: "baz"
    };
  });

  it("matches objects with the expect key/value pairs", function() {
    expect(foo).toEqual(jasmine.objectContaining({
      bar: "baz"
    }));
  });
});

सीएफ jasmine.github.io/partial-matching


3

इसका अपेक्षित व्यवहार, चूंकि किसी ऑब्जेक्ट के दो उदाहरण जावास्क्रिप्ट में समान नहीं हैं।

function Money(amount, currency){
  this.amount = amount;
  this.currency = currency;

  this.sum = function (money){
    return new Money(200, "USD");
  }
}

var a = new Money(200, "USD")
var b = a.sum();

console.log(a == b) //false
console.log(a === b) //false

एक स्वच्छ परीक्षण के लिए आपको अपने खुद के मैचर को लिखना चाहिए जो तुलना करता है amountऔर currency:

beforeEach(function() {
  this.addMatchers({
    sameAmountOfMoney: function(expected) {
      return this.actual.currency == expected.currency && this.actual.amount == expected.amount;
    }
  });
});


-4

आपकी समस्या सत्यता से है। आप किसी ऑब्जेक्ट के दो अलग-अलग उदाहरणों की तुलना करने की कोशिश कर रहे हैं जो नियमित समानता (a == b) के लिए सही है लेकिन सख्त समानता (a = b) के लिए सही नहीं है। चमेली का उपयोग करने वाला तुलनित्र चमेली है। Env.equals_ () जो सख्त समानता की तलाश करता है।

अपने कोड को बदले बिना आपको जो कुछ भी चाहिए, उसे पूरा करने के लिए आप नियमित समानता का उपयोग करके सत्यता की जांच कर सकते हैं, जैसे कि निम्नलिखित कुछ।

expect(money1.sum() == money2.sum()).toBeTruthy();

9
आपने जो कहा ==और ===पूरी तरह से गलत है। एक ही सामग्री के साथ एक वस्तु के दो अलग-अलग उदाहरण दोनों झूठे वापस आएंगे। किसी भी गैर-आदिम लोगों के लिए, ==और पहचान के साथ ===व्यवहार करें। jsfiddle.net/9mrmyrs6
जुआन मेंडेस

@JuanMendes ने एंड्रियास के। के उत्तर की जांच की ... आप लोग दो अलग-अलग बातें कह रहे हैं। क्या यह एक वस्तु बनाम शाब्दिक वस्तु को नया रूप देने में अंतर है?
फेरिस

@pherris mmm .... हाँ हम अलग-अलग बातें कह रहे हैं: मैं कह रहा हूँ कि जब गैर-आदिमों की तुलना करते हैं, तो इससे कोई फर्क नहीं पड़ता कि आप उपयोग करते हैं ==या नहीं ===, इसमें कोई ज़बरदस्ती शामिल नहीं है। एंड्रियास कह रहा है कि आप एक कस्टम मैचर बना सकते हैं। इस समस्या को ठीक करने के बारे में अंतिम कथन "सही" है लेकिन पहले पैराग्राफ में स्पष्टीकरण सिर्फ गलत है। jasmineयदि आप toBe()इसके बजाय का उपयोग करते हैं, तो वास्तव में ऑब्जेक्ट सामग्री की जांच करेंगेequals
जुआन मेंडेस

a == bअभी भी गलत देंगे aऔर अगर bअलग-अलग उदाहरण हैं, तो आप अपना जवाब संपादित करना चाह सकते हैं
लूई अल्मेडा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.