JavaScript Jest expect 0等于-0的含义?

7

我尝试使用TypeScript创建一个Jest测试,结果应该等于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

尽管我的控制台中的等于检查说它们相等,但实际情况并非如此。

0 == -0
true
0 === -0
true

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


也许我对这一切太生疏了,但是-0怎么会是一个有效的值呢?除非它被视为非数字,否则它不就是0吗? - edjm
1
@Elijah,它显然有一些用途。请参见有符号零 - trincot
@trincot 感谢您的教育。我以前不知道这个。 - edjm
4个回答

5
所有这些方法都使用Object.is来比较基本值,但当比较0-0时,Object.is会失败。
似乎没有任何特定相关的方法可以解决这个问题(有toBeCloseTo,但这不太合适,因为问题不在浮点精度上)。
一个可能的替代方案是:
expect(actual === expected).toBeTruthy();

我相信你在使用Object.is时是正确的;但我似乎读到toBe应该使用===?/** * 检查值是否符合预期。它使用`===`来检查严格相等性。 * 不要在浮点数中使用`toBe`。 * * 可选地,您可以通过泛型为预期值提供类型。 * 这对于确保预期对象具有正确的结构特别有用。 */ toBe<E = any>(expected: E): R; - O.O.
1
请参阅Jest文档中的.toBe它调用Object.is来比较值,这比===严格相等运算符更适合测试。 - CertainPerformance
1
现在应该已经修复了:https://github.com/DefinitelyTyped/DefinitelyTyped/pull/41250 现在它显示使用 Object.is,而不是 === - CertainPerformance

1
Jest在内部使用Object.is方法来断言该值,因此它将为false。

console.log(Object.is(0, -0))

参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness


你可以扩展和实现新方法来使用===(严格相等比较)或==(抽象相等比较)代替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);

1
之前的回答已经提到了jest在比较中内部使用的Object.is,您可以调整您的测试,在-0上使用Math.abs。
expect(Math.abs(actual)).toBe(expected)

1
那是由于 Object.is 的工作方式所导致的后果。你可以按照以下方式操作(假设 expected 不为 -0):
expect(actual === 0 ? 0 : actual).toBe(expected)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接