【问题标题】:Jest: expect or expect...not based on Boolean开玩笑:期望或期望...不是基于布尔值
【发布时间】:2020-09-16 21:02:07
【问题描述】:

在 Jest 中使用 test.each,我想传入一个布尔值来切换我是否期待某事。

这是我试图避免的重复代码类型:

if (expectFoo) {
  expect(anObject).toContainEqual(
    expect.objectContaining({
      name: "foo"
    })
  );
} else {
  expect(anObject).not.toContainEqual(
    expect.objectContaining({
      name: "foo"
    })
  );
}

这里有一些伪代码说明了我的首选(更简洁、更短)的方法:

expect(anObject).yesOrNo(expectFoo).toContainEqual(
  expect.objectContaining({
    name: "foo"
  })
);

Jest 里有这样的东西吗?

【问题讨论】:

  • 自定义匹配器就是这种情况。
  • 好的,但我真的不想从头开始重建像 .toContainEqual()objectContaining() 等 OOTB Jest 匹配器。我不太确定如何为not 之类的东西编写自定义替换,它位于expect() 和另一个匹配器之间。能做到吗?
  • 没有注意到评论。这是一个示例,以防它仍然相关。

标签: jestjs


【解决方案1】:

内置匹配器aren't public API,但可以从 Jest 使用的同一内部模块导入:

import matchers from 'expect/build/matchers';

自定义匹配器可以包装和组合内置匹配器:

expect.extend({
  toContainFoo(received, expectFoo = true) {
    const isNot = !expectFoo ? !this.isNot : this.isNot
    this.isNot = isNot; // affects error message
    const expected = matchers.objectContaining({
      name: "foo"
    });
    const result = matchers.toContainEqual.call(this, received, expected);
    result.pass = !isNot; // affects assertion logic
    return result;
  }
})

【讨论】:

  • 这并不是我所希望的,因为您必须为每个匹配器或匹配器组合单独实现它。有一个像通用 not 替换的东西会很好,它需要一个布尔参数。但这肯定比重建匹配器本身的逻辑要好。谢谢!
猜你喜欢
  • 2019-04-08
  • 2021-05-06
  • 1970-01-01
  • 2019-11-08
  • 2018-11-10
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
相关资源
最近更新 更多