javascript - 在 Jest .toMatchObject 中包含 toBeCloseTo

标签 javascript unit-testing jestjs

我正在测试一个对象是否匹配一组字段,但其中一个是 float ,我需要使用 .toBeCloseTo .如何在一个 expect 内完成?

expect(foo).toMatchObject({
  bar: 'baz',
  value: ???.toBeCloseTo(5),  // TODO
});

我可以使用 expect(foo.value).toBeCloseTo(5),但我不想将逻辑分解为多个 expect,每个一个 float 。

最佳答案

问题

docs for toMatchObject声明“您可以将属性与值或匹配器进行匹配”。

不幸的是,toBeCloseTo 目前不能用作非对称匹配器,它看起来像 these are the only asymmetric matchers currently provided by Jest .


解决方案

如果您使用 Jest v23 或更高版本,您可以创建自己的,本质上是复制 toBeCloseTo使用 expect.extend :

expect.extend({
  toBeAround(actual, expected, precision = 2) {
    const pass = Math.abs(expected - actual) < Math.pow(10, -precision) / 2;
    if (pass) {
      return {
        message: () => `expected ${actual} not to be around ${expected}`,
        pass: true
      };
    } else {
      return {
        message: () => `expected ${actual} to be around ${expected}`,
        pass: false
      }
    }
  }
});

const foo = {
  bar: 'baz',
  value: 4.9999
};

test('foo', () => {
  expect(foo.value).toBeAround(5, 3);  // SUCCESS in Jest > v20
  expect(foo).toMatchObject({
    bar: 'baz',
    value: expect.toBeAround(5, 3)  // SUCCESS only in Jest > v23
  });
});

请注意,expect.extend 创建了一个匹配器,它只能在 Jest v23 及更高版本中的 toMatchObject 等函数中使用。


替代方案

来自 this post由 Jest 合作者撰写:“虽然暗示但当前未记录,但 Jest 断言将不对称匹配器对象评估为 defined in Jasmine”。

使用 the logic from toBeCloseTo 的非对称匹配器可以这样创建:

const closeTo = (expected, precision = 2) => ({
  asymmetricMatch: (actual) => Math.abs(expected - actual) < Math.pow(10, -precision) / 2
});

const foo = {
  bar: 'baz',
  value: 4.9999
};

test('foo', () => {
  expect(foo).toMatchObject({
    bar: 'baz',
    value: closeTo(5, 3)  // SUCCESS
  });
});

关于javascript - 在 Jest .toMatchObject 中包含 toBeCloseTo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53369407/

相关文章:

ReactJS Ant 设计选择组件模拟更改事件

angular - 对 ngx-formly 自定义模板进行单元测试

jestjs - Stenciljs 和 Jest。意外的 token "export"

javascript - 为什么在 JavaScript 数组方法中绑定(bind)回调比使用 thisArg 更好?

javascript - 如何在JavaScript中隐藏html标签内容?

javascript - 使用 Angular JavaScript 将 MySQL 时间戳或 PHP 日期时间转换为本地客户端日期时间

unit-testing - Kafka Streams 测试 : java. util.NoSuchElementException:未初始化的主题: "output_topic_name"

php - 我的 javascript 联系表单不起作用

android - ActivityTestRule 未启动 androidTest 中的 Activity

java - 添加静态方法以促进更清洁的单元测试 - 好的做法?