【问题标题】:deal when several extended matchers with same name处理多个具有相同名称的扩展匹配器
【发布时间】:2021-01-10 12:00:36
【问题描述】:

我正在使用来自两个外部库 jest-dom/extend-expectjest-extended 的自定义匹配器。这两个库都定义了一个名为 toBeEmpty 的匹配器,但具有不同的行为。一种期望字符串/数组/对象/可迭代为空,另一种期望 DOM 元素为空。

我的感觉是 jest 配置中的顺序会影响测试中实际使用的匹配器:

    setupFilesAfterEnv: [
        '@testing-library/jest-dom/extend-expect',
        'jest-extended',
    ],
    setupFilesAfterEnv: [
        'jest-extended',
        '@testing-library/jest-dom/extend-expect',
    ],

使用第一个配置,jest-extended 版本优先,而使用第二个配置,jest-dom 版本优先。这是正确的吗?

有没有办法同时使用这两个匹配器?是否应该由库作者检测到另一个匹配器已经存在并进行处理?

【问题讨论】:

    标签: javascript unit-testing jestjs


    【解决方案1】:

    expect.extend 将匹配器合并到匹配器对象中,相同名称的匹配器将被替换,恕不另行通知,这是a known problem

    防止名称冲突的一种方法是为匹配器提供命名空间,并将它们设置在 setupFilesAfterEnv 中指定的 Jest 设置文件中。匹配器函数可以直接从匹配器库中导入并提供给expect.extend

    @testing-library/jest-dom 提供公共入口点来导入匹配器:

    const domMatchers = require('@testing-library/jest-dom/matchers');
    const namespacedDomMatchers = Object.fromEntries(
      Object.entries(domMatchers).map(([name, matcher]) => [`dom_${name}`, matcher])
    );
    
    expect.extend(namespacedDomMatchers);
    

    jest-extended 也有可以导入的内部模块:

    const extendedMatchers = require('jest-extended/dist/matchers');
    const namespacedExtendedMatchers = Object.fromEntries(
      Object.entries(extendedMatchers).map(([name, matcher]) => [`extended_${name}`, matcher])
    );
    
    expect.extend(namespacedExtendedMatchers);
    

    两个库中的匹配器都可以作为 dom_toBeEmptyextended_toBeEmpty 使用。

    【讨论】:

    • 非常感谢您清晰而详细的回复。重命名匹配器是一个有趣的选择
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 2020-10-04
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多