如何进行 Jest 测试以确保值位于枚举中?

问题描述 投票:0回答:3

这是我第一次与 jest 合作。我有一个场景,我想查看所选值是否在枚举中。这是我的测试用例:

    test('Should be valid', () => {
        expect(TestCasesExport.userAccStatus(ACC_STATUS.LIVE)).toContain(MEM_STATUS);
    });

MEM_STATUS
是一个枚举,
ACC_STATUS
是另一个与 MEM_STATUS 有一些共同值的枚举。

当我运行此测试时,received

'live'
并且预期是一个对象,即
{"LIVE": "live", ...}

那么,我应该在测试用例中更改哪些内容,以便确保枚举中存在 received

MEM_STATUS

typescript enums jestjs ts-jest
3个回答
3
投票

我有完全相同的问题。检查对象值

expect.any(SomeEnum)
将失败并显示:

TypeError: Right-hand side of 'instanceof' is not callable'

希望 jest 将来能够改进这一点,但是这里有一个 解决方法 可以让您确保值位于枚举中:

// We can't do expect.any(Currency)
// So check the value is in the enum (as an Object)'s values
// See https://stackoverflow.com/questions/73697466/jest-test-to-ensure-that-a-value-is-in-an-enum
const knownCurrencies = Object.values(Currency);
expect(knownCurrencies.includes(currency));

在其他地方(例如在对象值测试中),您只需测试该值是否是一个数字,但前面的代码将确保它出现在枚举中。

expect(lastTransaction).toEqual({
  ...
  // expect.any(Currency) won't work
  currency: expect.any(Number),
  ...
});

0
投票

我使用了辅助函数

expectEnum

const expectEnum = <T extends { [key: string]: string }>(enumType: T) =>
    expect.stringMatching(Object.values(enumType).join('|'));

举个例子:

enum ESomeEnum {
    black = 'black',
    white = 'white',
}
expect({ type: ESomeEnum.black }).toMatchObject({ type: expectEnum(ESomeEnum) });

如果需要,请根据您的目的修改此助手 fn

开玩笑expect.stringContaining文档


0
投票

您可以使用

jest-extended
库。 https://jest-extend.jestcommunity.dev/docs/

示例代码

    test('Should be valid', () => {
        expect(TestCasesExport.userAccStatus(ACC_STATUS.LIVE)).toBeOneOf(Object.values(MEM_STATUS));
    });
© www.soinside.com 2019 - 2024. All rights reserved.