2016-07-21 23 views
5

muszę zrobić pewne oczekiwania w Jasmine, jak:Jak porównać dwa obiekty z wartościami zmiennoprzecinkowymi w jaśminu?

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

Ale to się nie powiedzie, a wiadomość jest:

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

Jak mogę zrobić prawo czekowe?

+1

nie wiem dość o jaśminu, ale ogólnie biorąc, porównywanie dwóch pływaków z dokładnością powinno odbywać się poprzez testowanie bliskości w obrębie pewnego progu, tj. 'abs (realValue - expected) danh

Odpowiedz

7

toBeCloseTo dopasowujący się do porównania precyzja matematyki:

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

źródło: Jasmine matchers

+1

toBeCloseTo działa dobrze na numer. Ale jeśli chcesz potwierdzić obiekt z 20 właściwościami i jedną właściwością jest liczba, nie możesz użyć do Equal i musisz zrobić 20 oczekujących. Szkoda. – gentiane

1

W przypadku niektórych właściwości są pływaki i niektóre nie są:

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