如何在 Jest 中测试方法是否返回类的数组

Moh*_*sen 3 javascript typescript jestjs

我将测试一个方法(使用 TypeScript 语言)以确保它返回一个类的数组。

这是我的代码:

it('should return an array of Entity class', async () => {
    expect(await service.getAll()).toBeInstanceOf(Entity[]);
});
Run Code Online (Sandbox Code Playgroud)

但它显示以下错误消息[]

元素访问表达式应该带有一个参数。

T.J*_*der 6

由于 Jest 测试是运行时测试,因此它们只能访问运行时信息。您正在尝试使用一种类型,它是编译时信息。TypeScript 应该已经为您完成了类型方面的工作。(稍后会详细介绍。)

测试只能访问运行时信息这一事实有几个后果:

  • 如果返回空数组是有效的getAll(因为没有任何实体可供获取),则测试无法告诉您如果数组不为空,数组中是否会有元素。Entity它只能告诉你它有一个数组。

  • 在非空情况下,您必须检查数组的每个元素Entity以查看它是否是. 你说的Entity是一个类,而不仅仅是一个类型,所以这是可能的。我不是 Jest 的用户(我应该是),但它似乎没有专门针对此的测试;但它确实有toBeTruthy,我们可以用它every来告诉我们是否每个元素都是Entity

    it('should return an array of Entity class', async () => {
         const all = await service.getAll()
         expect(all.every(e => e instanceof Entity)).toBeTruthy();
    });
    
    Run Code Online (Sandbox Code Playgroud)

    但请注意,所有对every空数组的调用都会返回true,因此,空数组问题再次出现。

如果您的 Jest 测试是用 TypeScript 编写的,您可以通过确保 TypeScript 测试 的返回值的编译时类型来改进这一点getAll

it('should return an array of Entity class', async () => {
     const all = await service.getAll()
     expect(all.every(e => e instanceof Entity)).toBeTruthy();
});
Run Code Online (Sandbox Code Playgroud)

如果 TypeScript 无效,它会在编译时抱怨该赋值,而 Jest 会在运行时抱怨,如果它看到一个包含非对象的数组Entity


jonrsharpe 有一个很好的观点:与测试应该存在的特定值相比,此测试可能没有用。