我通过这种方式解决了这个问题。要向 Jest 添加功能,我们应该使用 expect.extend({...})。因此,要将 toBeType 方法添加到 Jest,我们应该将此代码写入某个 setupTests.js 文件:
// setupTests.js
expect.extend({
/**
* @param {*} received
* @param {string|string[]} arg
* @return {{pass:boolean,message:(function():string)}}
*/
toBeType(received, arg) {
const isCorrectType = arg => {
const receivedType = typeof received;
const checkForSingle = arg => {
const type = receivedType === 'object'
? Array.isArray(received)
? 'array'
: receivedType
: receivedType;
return type === arg;
};
const checkForArr = arg => {
const reducer = (prev, curr) => prev
|| isCorrectType(curr).isCorrect;
return arg.reduce(reducer, false);
};
return {
receivedType,
isCorrect: Array.isArray(arg)
? checkForArr(arg)
: checkForSingle(arg)
};
};
const {isCorrect, receivedType} = isCorrectType(arg);
return {
pass: isCorrect,
message: () => {
const toBe = Array.isArray(arg)
? arg.join(`' or '`)
: arg;
return `Expected '${received}' of '${receivedType}' type to be of '${toBe}' type(s)`;
}
};
}
});
不要忘记将setupTests.js 添加到jest.config.js 文件中,如下所示:
// jest.config.js
module.exports = {
...your_configurations...
setupFilesAfterEnv: ['<rootDir>/setupTests.js'],
};
此外,我们还必须扩展 global.d.ts 文件来表示解释器,我们在 extend 命名空间中有 toBeType 方法(如果只有您使用 TypeScript,则它是必需的)。这是我们必须添加到global.d.ts的代码:
// global.d.ts
declare namespace jest {
interface Matchers<R> {
toBeType(type:string|string[]);
}
}
这段代码说:获取jest命名空间并使用toBeType方法扩展Matchers<R>接口。 (可以在@types/jest节点模块查看Matchers<R>接口实现。)