我试图在ts中创建一个开玩笑的测试,结果应该等于0。这似乎在-0上失败。
test("zero equals fails", () => {
const actual = -0
const expected = 0
// expect(actual).toBe(expected)
// expect(actual).toStrictEqual(expected)
// expect(actual).toEqual(expected)
})
礼物:
Expected: 0
Received: -0
即使我的控制台中的equals check表示它们相等,也是如此。
0 == -0
true
0 === -0
true
在这种情况下应该使用什么断言比较?
答案 0 :(得分:3)
所有这些方法都使用Object.is
比较原始值,而将Object.is
与0
比较时-0
失败。
似乎没有specific relevant method(有toBeCloseTo
,但这不太合适,因为问题不是浮点精度)。
可能的替代方法是:
expect(actual === expected).toBeTruthy();
答案 1 :(得分:1)
Jest在内部使用Object.is
方法声明该值,因此它将为false。
console.log(Object.is(0, -0))
引用:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness
您可以extend and implement new method使用===
(严格相等比较)或==
(抽象相等比较)代替Object.is
(SameValue)方法。
expect.extend({
toBeEqCustom(received, expected) {
if (received === expected) {
return {
message: () => `expected ${received} not to be ${expected}`,
pass: true,
};
} else {
return {
message: () =>
`expected ${received} to be ${expected}`,,
pass: false,
};
}
},
});
// and use it like
expect(actual).toBeEqCustom(expected);
答案 2 :(得分:1)
先前的答案已经讨论了Object.is
,这是jest在内部用于比较的结果。您可以调整测试以在{0上使用Math.abs
。
expect(Math.abs(actual)).toBe(expected)
答案 3 :(得分:1)
这是Object.is
的工作方式的结果。您可以执行以下操作(假设expected
不是-0):
expect(actual === 0 ? 0 : actual).toBe(expected)