2013-05-06 31 views
66

Jasmine có các đối sánh được tích hợp toBetoEqual. Nếu tôi có một đối tượng như thế này:Kiểm tra đối tượng bình đẳng trong Jasmine

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

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

và cố gắng so sánh new Money(200, "USD") và kết quả của Tóm lại, những quẹt built-in sẽ không hoạt động như mong đợi. Tôi đã quản lý để triển khai một work-around dựa trên một tùy chỉnh equals method và matcher tùy chỉnh, nhưng nó dường như chỉ làm việc nhiều.

Cách tiêu chuẩn để so sánh các đối tượng trong Jasmine là gì?

Trả lời

131

tôi đang tìm kiếm điều tương tự và tìm thấy một cách hiện hữu làm như vậy mà không cần bất kỳ mã tùy chỉnh hoặc đối sánh nào. Sử dụng toEqual().

3

Hành vi mong đợi của nó, vì hai trường hợp của một đối tượng không giống nhau trong 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 

Đối với một bài kiểm tra sạch sẽ bạn nên viết khớp của riêng bạn mà so sánh amountcurrency:

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

Vấn đề của bạn là với truthyness. Bạn đang cố gắng để so sánh hai trường hợp khác nhau của một đối tượng đó là đúng đối với bình đẳng thường xuyên (a == b) nhưng không đúng cho sự bình đẳng nghiêm ngặt (a === b). Bộ so sánh mà hoa nhài sử dụng là jasmine.Env.equals_() có vẻ bình đẳng chặt chẽ.

Để thực hiện những gì bạn cần mà không thay đổi mã của bạn, bạn có thể sử dụng bình đẳng thường xuyên bằng cách kiểm tra truthyness với một chút gì đó như sau:

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

Những gì bạn nói về '==' và '===' là hoàn toàn sai. Hai trường hợp khác nhau của một đối tượng có cùng nội dung sẽ trả về false. Đối với các phần tử không nguyên thủy, '==' và '===' hoạt động giống hệt nhau. http://jsfiddle.net/9mrmyrs6/ –

+0

@JuanMendes xem câu trả lời của Andreas K. ... các bạn đang nói hai điều khác nhau. Đây có phải là một sự khác biệt trong việc tạo mới một đối tượng vs một đối tượng theo nghĩa đen? – pherris

+0

@pherris mmm .... vâng, chúng tôi đang nói những điều khác nhau: Tôi nói rằng khi so sánh các nguyên thủy, không quan trọng bạn có sử dụng '==' hay '===', không có sự ép buộc nào liên quan . Andreas đang nói rằng bạn có thể tạo một trình phù hợp tùy chỉnh. Câu lệnh cuối cùng về cách khắc phục sự cố này là "đúng" nhưng lời giải thích trong đoạn đầu tiên không chính xác. 'jasmine' sẽ thực sự kiểm tra nội dung đối tượng nếu bạn sử dụng' toBe() 'thay vì' equals' –

38

Nếu bạn đang tìm kiếm để so sánh đối tượng cục bộ, bạn có thể xem xét:

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

+0

Đây phải là câu trả lời đúng – chaotive

Các vấn đề liên quan