2016-07-21 15 views
5

Ich brauche Erwartung in Jasmin zu tun, wie:Wie vergleicht man zwei Objekte mit Float-Werten in Jasmin?

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

Aber es schlägt fehl, und die Nachricht ist:

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

Wie kann ich tun, um die richtige Kontrolle?

+1

Ich weiß nicht, Genug über Jasmin, aber im Allgemeinen sollte das Vergleichen von zwei Schwimmern mit Genauigkeit durchgeführt werden, indem die Nähe innerhalb eines Grenzwertes getestet wird, dh 'abs (realValue - expected) < – danh

Antwort

7

Die toBeCloseTo Matcher ist für Präzisionsberechnungen Vergleich:

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

Quelle: Jasmine matchers

+1

toBeCloseTo funktioniert gut für die Nummer. Wenn Sie jedoch ein Objekt mit 20 Eigenschaften und eine Eigenschaft mit einer Zahl angeben möchten, können Sie toEqual nicht verwenden und müssen 20 erwarten. Das ist schade. – gentiane

1

Im Fall einige Eigenschaften Schwimmer sind und manche nicht:

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)) 
})