Jest.js 是否有一个类似于toEqual的笑话匹配器,但将null和undefined视为相等的值?

wbrvyc0a  于 2023-01-03  发布在  Jest
关注(0)|答案(5)|浏览(117)

我有一个API,它不会忽略带有“空”的字段的JSON序列化(null,none,nil)值,并将它们全部返回为"fieldName": null。(类型脚本),我想将这些字段设置为可选字段(?),并在许多地方对它们不加定义。不幸的是(对我来说)笑话也是笑话()处理未定义的(测试代码中的值)和null(来自API的值)作为不同的值。我目前的解决方案是使用像string | null这样的联合类型,但它相当冗长,因为我总是要初始化这些字段。我检查了jest的引用,没有找到现成的解决方案。那么,创建一个自定义匹配器是解决我的问题的唯一方法吗?我无法更改API中的序列化策略。

zf9nrax1

zf9nrax11#

expect(null).toBe(undefined)失败!

基本上,有时在对对象求值后,一边是null,另一边是undefined
我尝试使用其他jest方法,如toEqual,但symply不起作用。

我的解决方案

expect(null == undefined).toBe(true)

rhfm7lfc

rhfm7lfc2#

你可以用Jest创建任何你想要的匹配。例如,这可能正是你所需要的:

beforeAll(function () {
  expect.extend({
    toBeMyEqual(received, expected) {
      const pass = this.equals(received, expected) ||
        (received === null && received === undefined) ||
        (received === undefined && received === null);
      if (pass) {
        return {
          message: () =>
            `expected ${received} not to equal ${expected}`,
          pass: true,
        };
      } else {
        return {
          message: () =>
            `expected ${received} to equal ${expected}`,
          pass: false,
        };
      }
    }
  })
})

test('should pass', () => {
  expect(null).toBeMyEqual(undefined);
})

您可以将其添加到某个安装脚本中,我只是为了测试而将其添加到beforeAll中。
以下是相关文档:
https://jestjs.io/docs/en/expect#expectextendmatchers
https://jestjs.io/docs/en/expect#custom-matchers-api

nhaq1z21

nhaq1z213#

经过长时间的搜索,这个难题的最佳解决方案是使用.toBeTruthy,如果值是nullundefined . details here
但是,请记住,如果使用空字符串和false布尔值,它将失败

xmq68pz9

xmq68pz94#

使用jest-extended(Jest社区维护的附加Jest匹配器),您可以使用toBeNil()
检查值是否为nullundefined时,使用.toBeNil

test('passes when value is null or undefined', () => {
  expect(null).toBeNil()
  expect(undefined).toBeNil()
  expect(true).not.toBeNil()
})

参见:https://github.com/jest-community/jest-extended#tobenil

cedebl8k

cedebl8k5#

使用expect(null || undefined).toBeFalsy()-这是jest推荐的:https://jestjs.io/docs/expect#tobefalsy

相关问题