I'm testing a Javascript function returning an array of numbers, to see if the returned array contains the same elements as the array containing the expected output:
expect(myArray).toEqual(expectedArray);
This works flawlessly if myArray and expectedArray only contain integers, but fail if there is at least one float present, due to floating-point precision errors. toBeCloseTo
does not seem to function on arrays.
Currently I'm doing a loop to to do member-wise checking:
for (var i = 0; i < myArray.length; i++) {
expect(myArray[i]).toBeCloseTo(expectedArray[i]);
}
... but is there a cleaner way to do this? If the test fails for whatever reason, the output is bloated with a hideous amount of error messages.
I'm testing a Javascript function returning an array of numbers, to see if the returned array contains the same elements as the array containing the expected output:
expect(myArray).toEqual(expectedArray);
This works flawlessly if myArray and expectedArray only contain integers, but fail if there is at least one float present, due to floating-point precision errors. toBeCloseTo
does not seem to function on arrays.
Currently I'm doing a loop to to do member-wise checking:
for (var i = 0; i < myArray.length; i++) {
expect(myArray[i]).toBeCloseTo(expectedArray[i]);
}
... but is there a cleaner way to do this? If the test fails for whatever reason, the output is bloated with a hideous amount of error messages.
Share Improve this question asked Feb 10, 2016 at 14:45 John WeiszJohn Weisz 32k13 gold badges96 silver badges136 bronze badges 2-
Check out
toBeCloseTo
it appears to do what you want. – HBP Commented Feb 10, 2016 at 15:13 - 2 Maybe you can have a look at the ArrayContaining matcher, adapt the loop and create your own matcher. – Sonata Commented Feb 10, 2016 at 16:26
3 Answers
Reset to default 14The following code should answer your question:
function expectToBeCloseToArray(actual, expected) {
expect(actual.length).toBe(expected.length)
actual.forEach((x, i) =>
expect(x).withContext(`[${i}]`).toBeCloseTo(expected[i])
)
}
We very ofthen use this syntax
expect(...).toBeCloseToArray(array, x)
// Where x is the precision, i.e., the number of decimal places.
// For example, if x = 3, it checks for three digits after the decimal point (1.XXX).
Try this:
for (let i=0; i<returnedArray.length; i++){
if(expectedArray.indexOf(returnedArray[i]) === -1 ){
console.log("not a match")
break;
}else{
console.log("it's a match")
break;
}
}