ตรวจสอบความเท่าเทียมกันของวัตถุในจัสมิน


87

จัสมินมีตัวจับคู่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วิธีการที่กำหนดเองและตัวจับคู่แบบกำหนดเอง แต่ดูเหมือนจะได้ผลมาก

วิธีมาตรฐานในการเปรียบเทียบวัตถุในจัสมินคืออะไร?

คำตอบ:


174

ฉันกำลังมองหาสิ่งเดียวกันและพบวิธีที่มีอยู่ในการดำเนินการดังกล่าวโดยไม่ต้องใช้โค้ดหรือตัวจับคู่ ใช้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"
    }));
  });
});

cf. Jasmine.github.io/partial-matching


3

เป็นพฤติกรรมที่คาดหวังเนื่องจากสองอินสแตนซ์ของออบเจ็กต์ไม่เหมือนกันใน JavaScript

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) ตัวเปรียบเทียบที่มะลิใช้คือ jasmine.Env.equals_ ()ซึ่งมองหาความเท่าเทียมกันอย่างเข้มงวด

เพื่อให้บรรลุสิ่งที่คุณต้องการโดยไม่ต้องเปลี่ยนรหัสของคุณคุณสามารถใช้ความเท่าเทียมกันตามปกติโดยตรวจสอบความจริงด้วยสิ่งต่อไปนี้:

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

9
สิ่งที่คุณพูดถึง==และ===ผิดอย่างสิ้นเชิง สองกรณีที่แตกต่างกันของวัตถุที่มีเนื้อหาเดียวกันจะส่งคืนเท็จ สำหรับสิ่งที่ไม่ใช่ดั้งเดิม==และมี===พฤติกรรมเหมือนกัน jsfiddle.net/9mrmyrs6
Juan Mendes

@JuanMendes ตรวจสอบคำตอบของ Andreas K. ... พวกคุณกำลังพูดสองสิ่งที่แตกต่างกัน นี่คือความแตกต่างในการสร้างวัตถุใหม่กับวัตถุตามตัวอักษรหรือไม่?
pherris

@ เฟอร์ริสอืม .... ใช่เรากำลังพูดในสิ่งที่แตกต่างกัน: ฉันกำลังบอกว่าเมื่อเปรียบเทียบสิ่งที่ไม่ใช่แบบดั้งเดิมไม่สำคัญว่าคุณจะใช้==หรือ ===ไม่มีการบังคับใด ๆ ที่เกี่ยวข้อง Andreas บอกว่าคุณสามารถสร้างตัวจับคู่ที่กำหนดเองได้ ข้อความสุดท้ายเกี่ยวกับวิธีแก้ไขปัญหานี้ "ถูกต้อง" แต่คำอธิบายในย่อหน้าแรกไม่ถูกต้อง jasmineจะตรวจสอบเนื้อหาออบเจ็กต์จริง ๆ หากคุณใช้toBe()แทนequals
Juan Mendes

a == bจะยังคงให้เท็จหากaและbเป็นกรณีที่แตกต่างกันคุณอาจต้องการแก้ไขคำตอบของคุณ
Louie Almeda
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.