在 Jest .toMatchObject 中包含 toBeCloseTo

2024-04-21

我正在测试一个对象是否与一组字段匹配,但其中一个是浮点,我需要使用.toBeClearTo https://jestjs.io/docs/en/next/expect#tobeclosetonumber-numdigits。怎么可能在一段时间之内完成expect https://jestjs.io/docs/en/next/expect?

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

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


Issue

The 文档用于toMatchObject https://jestjs.io/docs/en/expect#tomatchobjectobject声明“您可以将属性与值或匹配器进行匹配”。

很遗憾,toBeCloseTo目前不可用作非对称匹配器,它看起来像这些是 Jest 目前提供的唯一不对称匹配器 https://github.com/facebook/jest/blob/c01b4c75a2f65e9fa122adf69b0ac11875f1fc74/packages/expect/src/index.js#L324-L337.


Solution

如果您使用 Jest v23 或更高版本,您可以创建自己的,本质上是复制toBeCloseTo https://github.com/facebook/jest/blob/c01b4c75a2f65e9fa122adf69b0ac11875f1fc74/packages/expect/src/matchers.js#L87-L102 using expect.extend https://jestjs.io/docs/en/expect#expectextendmatchers:

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创建一个可以在函数中使用的匹配器,例如toMatchObject仅适用于 Jest v23 及更高版本。


替代解决方案

From 这个帖子 https://github.com/facebook/jest/issues/4711#issuecomment-337236678一位 Jest 合作者:“虽然这是暗示的,但是目前没有记录,玩笑断言将非对称匹配器对象评估为茉莉花中定义 https://jasmine.github.io/tutorials/your_first_suite#section-Custom_asymmetric_equality_tester".

不对称匹配器使用逻辑来自toBeCloseTo https://github.com/facebook/jest/blob/c01b4c75a2f65e9fa122adf69b0ac11875f1fc74/packages/expect/src/matchers.js#L90可以这样创建:

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
  });
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Jest .toMatchObject 中包含 toBeCloseTo 的相关文章

随机推荐

  • rSpec 和 Rails3 中的存根设计

    如何使用 rSpec 在 Rails 3 中存根 Devise 我有一个UsersController and a User模型 目前 这两者都与 Devise 相关 我正在编写控制器规格 但我真的很难实现作为 Devise 的期望sign
  • 如何为ListBox(值)索引或树视图节点设置相同的按钮事件?

    我有 C Win form 如下所示 我也有一些数组作为列表框的菜单 public string ArrayMain 1 Water 2 Air 3 Soil 4 Fire public string ArrayWater 1 Salty
  • 与最接近的值左连接,不重复

    我想在 MS SQL 中实现如下所示的效果 使用 2 个表并通过连接而不是迭代 从表 A 中 我希望每一行从表 B 中识别列表中的哪一个是它们最接近的值 并且当选择值时 该值不能重复使用 如果您以前做过类似的事情 请帮忙 先感谢您 SOre
  • 为 PHP CLI 安装 Xdebug

    我在用着XAMPP http www apachefriends org tr index html在 Mac OS 上 尝试使用PHPUnit http phpunit de的代码覆盖率检查 这需要XDebug http phpunit
  • EF 中的过滤器包含[重复]

    这个问题在这里已经有答案了 我有这个 LINQ 查询 它在 Include 中的筛选器上给出错误 当我在 Google 上搜索我的朋友时 我发现无法在 包含 中进行过滤 我已经找到了一些方法可以以另一种方式做到这一点 但我无法让它适用于我的
  • 如何找到第一个设置位的索引

    是否有按位解决方案来查找仅设置一个位的掩码中第一个设置位的索引 例如对于 8 则为 3 对于 16 gt 4 依此类推 请不要循环 我能想到的最佳解决方案是创建位到索引的映射 function firstBit x return Math
  • 如何为 HTML5 画布上下文设置 2 种字体?

    我试图让画布在绘制文本时使用两种字体 这是因为我的主要字体是 Comic Sans MS 这是一个儿童应用程序 由于我在 iPad 上找不到 Comic Sans 因此我尝试用 MarkerFelt Thin 来替代它 我尝试使用以下语句的
  • 如何在 powershell 提示符中使用波形符?

    所以我明白了 function global prompt Commands go here 在 powershell 中设置提示符 我可以用Get Location获取当前工作目录 我可以cd 并在我的主目录中 但是我可以让提示使用波浪号
  • 如何连接Kafka和Elasticsearch?

    我是Kafka的新手 我使用kafka通过logstash收集netflow 可以 并且我想将数据从kafka发送到elasticsearch 但是存在一些问题 我的问题是如何将 Kafka 与 Elasticsearch 连接起来 net
  • 无法从量角器测试中的元素值返回字符串

    因此 我试图从解决此承诺的元素值中获取要返回的字符串值 我想将原始字符串值传递给我在量角器测试中构建的另一个函数 这是元素 div div
  • 如何保证成员4字节对齐?

    为了使用 OSAtomicDecrement mac 特定的原子操作 我需要提供一个 4 字节对齐的 SInt32 这样的煮法有用吗 还有其他方法可以解决对齐问题吗 struct SomeClass SomeClass member sto
  • Cassandra cli:将十六进制值转换为人类可读的格式

    我开始于卡桑德拉 questions tagged cassandra 当我跑步时list or get命令在cassandra cli questions tagged cassandra cli 我得到这样的结果 default use
  • 检查用户是否登录时未定义 nil

    我想使用 Firebase 来检测用户是否登录 var auth new FirebaseSimpleLogin Ref function err user if err console log err else if user conso
  • 启动脚本似乎不起作用

    我最近开始在我的一些项目中使用 Google 的计算引擎 问题是我的启动脚本似乎不起作用 由于某种原因我的脚本不起作用 虚拟机具有启动脚本元数据并且工作正常当我手动运行它时 sudo google metadata script runne
  • 如何根据百分比更改imageview中的图像颜色并将颜色填充到该百分比

    如何根据百分比填充图像TextView 它应该根据百分比变化TextView 在下面的代码中 高度布局正在改变 但我希望图像的颜色应该根据百分比 textview 电池 的值 改变 CODE private void displayData
  • 如何将 NSTimer 与这个简单的 while 循环一起使用?

    我有一个正在执行的 void 方法 在某一时刻它会进入一个 while 循环 该循环在请求时直接从加速度计获取值 我浏览了有关 NSTimer 类的文档 但我无法理解在我的情况下如何准确地使用这个对象 e g void play if ac
  • 使用代码将 X509 证书添加到存储区

    此代码会将 x509 cer 证书文件添加到证书存储中 使用System Security Cryptography X509Certificates var filename Cert cer var cert new X509Certi
  • Selenium 服务器错误:无法获取浏览器

    我在 Windows 7 上运行 Selenium Standalone Server 2 25 并使用 Internet Explorer 9 作为浏览器 对于每个需要打开浏览器的测试 我都会收到此错误 Selenium WebDrive
  • 在复合组件的属性中使用EL

    我的 JSF 自定义组件代码
  • 在 Jest .toMatchObject 中包含 toBeCloseTo

    我正在测试一个对象是否与一组字段匹配 但其中一个是浮点 我需要使用 toBeClearTo https jestjs io docs en next expect tobeclosetonumber numdigits 怎么可能在一段时间之