我需要在Jest中添加一些类型检查器。它看起来一定像expect(someVar).toBeType('string')
和expect(someVar).toBeType(['string', 'object'])
。
我试图添加一些checker-helper,但是看起来有点难看。
const toBeType = (arg:any, type:string) => {
const argType = typeof arg;
if (argType !== type)
throw new Error(`Expected '${type}' but got '${argType}' for the '${arg}'.`);
};
我想向jest
命名空间添加类似的功能,以便能够调用expect(someVar).toBeType('boolean')
之类的类型检查器。
答案 0 :(得分:0)
您可以使用类似javascript的检查类型
您可以在下面测试代码:
if (argType !== type)
答案 1 :(得分:0)
我以这种方式解决了这个问题。要向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
文件以表示解释器,我们在toBeType
命名空间中拥有extend
方法(仅在使用TypeScript时才需要)。这是我们必须添加到global.d.ts
的代码:
// global.d.ts
declare namespace jest {
interface Matchers<R> {
toBeType(type:string|string[]);
}
}
这段代码说:获取jest
命名空间,并使用Matchers<R>
方法扩展toBeType
接口。 (您可以在@types/jest
节点模块上查看Matchers<R>
接口的实现。)