【问题标题】:How to add types for jest test with describe.each?如何使用 describe.each 为 jest 测试添加类型?
【发布时间】:2019-12-21 14:45:36
【问题描述】:
const has = (object: Record<string, unknown>, key: string) => {
    return object != null && hasOwnProperty.call(object, key)
};

has.test.ts

describe('has', () => {
    const obj = {
        name: 'name',
        1: 1,
        false: false,
        undefined: undefined
    };
    describe.each([
        ['name', true],
        [1, true],
        [false, true],
        [undefined, true],
        ['no-such-key', false]
    ])('when key = %s', (key, expected) => {
        it(`should return ${expected}`, () => {
            expect(has(obj, key)).toBe(expected);
        });
    });
});

有没有人有为开玩笑测试添加类型的经验?我正在使用describe.each 循环数据集。虽然我能够成功运行测试,但我想解决这个打字问题。有人可以帮我吗?

【问题讨论】:

    标签: typescript jestjs


    【解决方案1】:

    您似乎没有最新版本的类型来开玩笑,尝试将包@types/jest更新到最新版本(它包含Each接口的类型定义)。

    如果由于某些原因无法做到这一点,您始终可以使用名为 declaration-merging 的打字稿功能自行“扩展”类型:

    // jest.d.ts file
    
    declare namespace jest {
    
      interface Each {
        // Exclusively arrays.
        <T extends any[]>(cases: ReadonlyArray<T>): (name: string, fn: (...args: T) => any, timeout?: number) => void;
        // Not arrays.
        <T>(cases: ReadonlyArray<T>): (name: string, fn: (...args: T[]) => any, timeout?: number) => void;
        (cases: ReadonlyArray<ReadonlyArray<any>>): (
            name: string,
            fn: (...args: any[]) => any,
            timeout?: number
        ) => void;
        (strings: TemplateStringsArray, ...placeholders: any[]): (
            name: string,
            fn: (arg: any) => any,
            timeout?: number
        ) => void;
      }
    
      interface Describe {
        each: Each
      }
    }
    

    您可能还需要指定 typeRoots 配置选项,以便 typescript 可以选择您的自定义类型

    更新: 抱歉,我刚刚注意到您的问题不是没有Each 接口,而是类型不正确。 在您的情况下,打字稿似乎无法正确推断类型,因此您可能希望明确指定泛型类型,例如:

    type TestTuple = [string | number | boolean, boolean];
    
    describe.each<TestTuple>([
      ['name', true],
      [1, true],
      [false, true],
      [undefined, true],
      ['no-such-key', false]
    ])('when key = %s', (a, b) => {
        // do your stuff
    });
    

    【讨论】:

    • "@types/jest": "^24.0.15" 这就是我正在使用的。它不是那个旧版本。我检查了 node_modules。 jest/index.d.ts 包含为 Each 输入的内容
    • @Ich 所以不需要扩展类型,它已经存在了。我已经用更多信息更新了我的评论,这应该对你有用。
    猜你喜欢
    • 2019-07-27
    • 2023-01-10
    • 2016-01-21
    • 1970-01-01
    • 2017-11-11
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多