Javascript 在for..of循环中需要值,但接收到错误的值

Javascript 在for..of循环中需要值,但接收到错误的值,javascript,typescript,jestjs,Javascript,Typescript,Jestjs,我有一个枚举: export enum Skills { Baking = 'BAKING', Archery = 'ARCHERY', Piano = 'PIANO', Run = 'RUN' } 我正在尝试循环此枚举,以检查是否存在所有值: describe('skills', () => { test('it contains all values and pass', () => { funct

我有一个枚举:

export enum Skills {
    Baking = 'BAKING',
    Archery = 'ARCHERY',
    Piano = 'PIANO',
    Run = 'RUN'
}
我正在尝试循环此枚举,以检查是否存在所有值:

    describe('skills', () => {
        test('it contains all values and pass', () => {
            function enumKeys<E>(e: E): (keyof E)[] {
                return Object.keys(e) as (keyof E)[];
            }

            for (const key of enumKeys(Skills)) {
                const sports: string = await skills[key];
                expect(sports).toBe('BAKING');
                expect(sports).toBe('ARCHERY');
                //.. expect the rest of list
            }
        });
    });
description('skills',()=>{
测试('它包含所有值并通过',()=>{
函数枚举键(e:e):(keyof e)[]{
返回Object.keys(e)as(keyof e)[];
}
用于(枚举键的常量键(技能)){
康斯特体育:字符串=等待技能[键];
期望(运动)。托比(“烘焙”);
期望(运动)。托比(“射箭”);
//…期待列表的其余部分
}
});
});

然而,测试失败了,第二个expect“ARCHERY”接受了“BAKING”。如果我去掉第二个期望值,那么第一个期望值是接受“射箭”,这是下一个值。我不明白这里发生了什么,它接受价值的方式。我如何编写此代码来测试整个列表?

既然
sports
是循环任何给定迭代中的一个字符串,那么
expect(sports).toBe('BAKING')
expect(sports).toBe('archey')
怎么可能都通过呢?你为什么要等待技能[关键]——这是一个字符串,不是承诺。但更广泛地说,你到底想测试什么?如果您的代码试图使用一个实际不在枚举中的值,它将无法编译。没用?我的意思是你可以做
expect(Skills.Baking)。toBe('Baking')
,等等,但那有什么意义呢?@jornsharpe谢谢你指出并等待,那是个错误。我希望使用循环显式地进行动态测试。这个列表实际上很长,有50个项目,我认为循环可以减少重复。有没有办法用我的循环来实现这一点?再次感谢你,我对这样的循环测试还是新手。但是如果你在对象的实际内容上使其动态化,那么你就不会真正测试任何东西。当然你可以做
expect(Skills[key])。toBe(key.toUpperCase())
(假设这也适用于其他值),但是如果你这样做了,那么删除例如
Piano='Piano',
(或者每个条目,或者添加一个不应该在那里但遵循模式的条目)测试仍然会通过(假设代码已编译)因为您的测试只是断言“此对象包含它所包含的内容”。从根本上说,不清楚你希望通过测试来实现什么。@jonrsharpe我正在努力确保我不会意外地错过一项技能,例如,当它从数据中返回时。因为这是一个很长的列表。例如,如果Biking='Biking'从数据中返回,我想确保我的枚举中有这个。对不起,我希望我要测试的东西有道理。谢谢你向我解释这件事。