我使用来自两个外部库jest-dom/extend-expect和jest-extended的自定义匹配器。这两个库都定义了一个名为toBeEmpty的匹配器,但具有不同的行为。一个期望string/array/object/iterable为空,另一个期望DOM元素为空。
我的感觉是jest配置中的顺序会影响测试中实际使用的匹配器:
setupFilesAfterEnv: [
'@testing-library/jest-dom/extend-expect',
'jest-extended',
], setupFilesAfterEnv: [
'jest-extended',
'@testing-library/jest-dom/extend-expect',
],对于第一个配置,jest-extended版本优先,而对于第二个配置,jest-dom版本优先。这是正确的吗?
有没有办法同时使用两个匹配器?库作者是否应该检测到已经存在另一个匹配器并对其进行处理?
发布于 2020-09-24 17:17:15
expect.extend将matcher合并到matcher对象中,同名的matcher会在没有通知的情况下被替换,这就是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_toBeEmpty和extended_toBeEmpty的形式提供。
https://stackoverflow.com/questions/64042280
复制相似问题