无视空格的字符串的 Jest 相等匹配器

Posted

技术标签:

【中文标题】无视空格的字符串的 Jest 相等匹配器【英文标题】:Jest Equality Matcher For Strings That Disregards Whitespace 【发布时间】:2018-07-05 03:35:13 【问题描述】:

Jest 的toEqual 匹配器在检查相等性时会考虑空格。在测试中格式化预期值时,不可能以匹配包含换行符、制表符等的字符串的方式这样做。

Jest 是否提供了一种在匹配时忽略空格的方法?

注意:我编辑了问题以使其更通用。

【问题讨论】:

flatErrorMessage 是什么样的?你测试什么? 【参考方案1】:

正如@Timo 所说,这样做的唯一方法似乎是使用自定义匹配器。这是一个基于 Jest 的 toEqual 匹配器将所有空白压缩到单个空格以提高可读性的方法。它将处理制表符、换行符等。它会像包含的 Jest 匹配器一样为您提供漂亮的输出:

//matchStringIgnoringWhiteSpace.js

import  replace, map, equals  from 'ramda';
import  matcherHint, printReceived, printExpected  from 'jest-matcher-utils';
import diff from 'jest-diff';

const replaceWhitespace = replace(/\s+/g, ` `);
const compressWhitespace = map(replaceWhitespace);

const name = `toEqualWithCompressedWhitespace`;

export default function (received, expected) 
  const [
    receivedWithCompresssedWhitespace,
    expectedWithCompresssedWhitespace,
  ] = compressWhitespace([received, expected]);
  const pass = equals(
    receivedWithCompresssedWhitespace,
    expectedWithCompresssedWhitespace
  );
  const message = pass
    ? () =>
        `$matcherHint(`.not.$name`)\n\n` +
        `Uncompressed expected value:\n` +
        `  $printExpected(expected)\n` +
        `Expected value with compressed whitespace to not equal:\n` +
        `  $printExpected(expectedWithCompresssedWhitespace)\n` +
        `Uncompressed received value:\n` +
        `  $printReceived(received)\n` +
        `Received value with compressed whitespace:\n` +
        `  $printReceived(receivedWithCompresssedWhitespace)`
    : () => 
        const diffString = diff(
          expectedWithCompresssedWhitespace,
          receivedWithCompresssedWhitespace,
          
            expand: this.expand,
          
        );
        return (
          `$matcherHint(`.$name`)\n\n` +
          `Uncompressed expected value:\n` +
          `  $printExpected(expected)\n` +
          `Expected value with compressed whitespace to equal:\n` +
          `  $printExpected(expectedWithCompresssedWhitespace)\n` +
          `Uncompressed received value:\n` +
          `  $printReceived(received)\n` +
          `Received value with compressed whitespace:\n` +
          `  $printReceived(receivedWithCompresssedWhitespace)$
            diffString ? `\n\nDifference:\n\n$diffString` : ``
          `
        );
      ;
  return 
    actual: received,
    expected,
    message,
    name,
    pass,
  ;
;

要注册自定义匹配器,您需要将其添加到 setupTests 文件中。首先使用 setupFilesAfterEnv 字段在 jest.config.js 中注册 setupTests:

 setupFilesAfterEnv: `<rootDir>/path/to/setupTests.js`,

然后在expect对象上注册自定义匹配器。

//setupTests.js

import toMatchStringIgnoringWhitespace from "<rootDir>/path/to/matchStringIgnoringWhiteSpace";

expect.extend(
    toMatchStringIgnoringWhitespace: toMatchStringIgnoringWhitespace
); 

如果您使用 TypeScript,您还需要将类型添加到 expect 对象 following the instructions here。

【讨论】:

这非常有用——只建议更改:const replaceWhitespace = (str) =&gt; str.replace(/\s+/g, ' ').trim() 以考虑字符串开头/结尾处的空格。 太棒了。我已经用最新的标准做法更新了你的答案。 使用 ramda 库是“标准做法”吗? Ramda 自初始版本以来一直是此 sn-p 的依赖项。【参考方案2】:

据我所知,开箱即用的 Jest 无法实现这一点。

但是,write your own reusable matcher using expect.extend 非常简单。从两个字符串中删除所有空格,例如通过str.replace(/\s/g, ''),并比较字符串。

【讨论】:

【参考方案3】:

虽然这不是直接的答案,但您也可以这样做:

mockedFunction.mock.calls[0] // To get array of arguments

// or 

mockedFunction.mock.calls[0][0] // to get first argument and so on

然后与相等比较。

【讨论】:

以上是关于无视空格的字符串的 Jest 相等匹配器的主要内容,如果未能解决你的问题,请参考以下文章

前端测试框架Jest系列教程 -- 匹配器

前端测试框架Jest系列教程 -- Matchers(匹配器)

是否有忽略 jest.js 中元素位置的数组相等匹配函数?

Nignx入门locationroot配置

Jest - Externalise 扩展期望匹配器

为啥不显示我的 Jest 自定义匹配器的“消息”?