Javascript开玩笑期望0等于-0

时间:2019-12-15 11:58:37

标签: javascript jestjs

我试图在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

在这种情况下应该使用什么断言比较?

4 个答案:

答案 0 :(得分:3)

所有这些方法都使用Object.is比较原始值,而将Object.is0比较时-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)