如何在TypeScript应用程序中为Jest添加类型检查器?

时间:2019-08-30 08:14:59

标签: javascript unit-testing testing automated-tests jestjs

我需要在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')之类的类型检查器。

2 个答案:

答案 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>接口的实现。)