Jasmine 에는 매처 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
메서드 및 사용자 지정 매처를 기반으로 한 해결 방법 을 구현 했지만 많은 효과가있는 것 같습니다.
Jasmine에서 물체를 비교하는 표준 방법은 무엇입니까?
답변
나는 똑같은 것을 찾고 있었고 사용자 정의 코드 또는 매처없이 그렇게 할 수있는 기존 방법을 찾았습니다. 사용 toEqual()
.
답변
부분 개체를 비교하려는 경우 다음을 고려할 수 있습니다.
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"
}));
});
});
답변
객체의 두 인스턴스가 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;
}
});
});
답변
lodash _.isEqual이 그에 적합하다는 것을 알았습니다.
expect(_.isEqual(result, expectedResult)).toBeTruthy()
답변
당신의 문제는 진실성에 있습니다. 일반 같음 (a == b)에 대해 참이지만 완전 같음 (a === b)에 대해서는 참이 아닌 객체의 두 인스턴스를 비교하려고합니다. 재스민이 사용하는 비교기는
엄격한 동등성을 찾는 jasmine.Env.equals_ () 입니다.
코드를 변경하지 않고 필요한 작업을 수행하려면 다음과 같이 진실성을 확인하여 정규 동등성을 사용할 수 있습니다.
expect(money1.sum() == money2.sum()).toBeTruthy();