2016-07-21 10 views
5

私は次のように、ジャスミンにいくつかの期待を実行する必要があります。2つのオブジェクトをジャスミンのフロート値と比較するには?

let realValue = callSomeMethod(); 
let expected = [{ 
    total: 33, 
    saved: 1.65 
}]; 
expect(realValue).toEqual(expected); 

しかし、それは失敗し、メッセージは次のとおりです。

Expect [ Object({ total: 33, saved: 1.6500000000000001 })] 
to equal [Object({ total: 33, saved: 1.65 })]. 

私は右のチェックをどのように行うことができますか?

+1

私にはわかりませんジャスミンについては十分ですが、一般的な計算では、2つの浮動小数点数を精度で比較するには、ある閾値内の近さをテストすることによって行う必要があります。つまり、 'abs(realValue-expected)<εil' – danh

答えて

7

toBeCloseToマッチャーは、精密な数学の比較のためにある:

expect(1.6500000000000001).toBeCloseTo(1.65, 2); 
expect(1.6500000000000001).toBeCloseTo(1.65, 15); 
expect(1.6500000000000001).not.toBeCloseTo(1.65, 16); 

ソース:Jasmine matchers

+1

toBeCloseToは数値に対して正常に機能します。しかし、20のプロパティを持つオブジェクトをアサートし、1つのプロパティが数値である場合、toEqualを使用することはできず、20の期待をする必要があります。それは残念だ。 – gentiane

1

場合、いくつかのプロパティは、浮動小数点数であり、一部ではない:

let realValue = callSomeMethod(); 
let expectedFloat = { 
    saved: 1.65, 
    otherFloat: 6.44 
} 
let expectedOther = { 
    firstName: 'Paul', 
    total: 33, 
}; 
let expected = { 
    ...expectedFloat, 
    ...expectedOther 
} 

let floatNames = Object.getOwnPropertyNames(expectedFloat); 
const testFloatProperty = (name) =>() => { 
    expect(realValue[name]).toBeCloseTo(expectedFloat[name], 3) 
} 

for (let i in floatNames) { 
    it('should be close to expected ' + floatNames[i], testFloatProperty(floatNames[i])); 
} 

it('should contain other expected props', function() { 
    expect(realValue).toEqual(jasmine.objectContaining(expectedOther)) 
}) 
関連する問題