这是我第一次与 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
?
我有完全相同的问题。检查对象值
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),
...
});
我使用了辅助函数
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
您可以使用
jest-extended
库。
https://jest-extend.jestcommunity.dev/docs/
示例代码
test('Should be valid', () => {
expect(TestCasesExport.userAccStatus(ACC_STATUS.LIVE)).toBeOneOf(Object.values(MEM_STATUS));
});