如何在 Jest 中测试方法 returns 是否为 class 的数组

How to test if a method returns an array of a class in Jest

我将测试一个方法(使用 TypeScript 语言)以确保它 returns 一个 class.

的数组

这是我的代码:

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

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

An element access expression should take an argument.

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

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

  • If 它对 getAll 到 return 一个空数组有效(因为没有任何实体可以获取),测试 cannot 告诉您数组 是否会有 如果数组不为空则其中有 Entity 个元素。它只能告诉你它有一个数组。

  • 在 non-empty 的情况下,您必须检查 数组的每个元素 以查看它是否是 Entity。你说 Entity 是一个 class,而不仅仅是一个类型,所以这是可能的。我不是 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();
    });
    

    当心,不过,所有对空数组 return trueevery 调用,所以再次出现空数组问题抬起头。

如果您的 Jest 测试是用 TypeScript 编写的,您可以通过确保 TypeScript 测试 getAll 的 return 值的 compile-time 类型来改进它:

it('should return an array of Entity class', async () => {
    const all: Entity[] = await service.getAll()
    //       ^^^^^^^^^^
    expect(all.every(e => e instanceof Entity)).toBeTruthy();
});

如果赋值无效,TypeScript 会在编译时抱怨该赋值,而 Jest 会在运行时发现包含非 Entity 对象的数组时抱怨。


但是 :与测试应该存在的特定值相比,此测试可能 没有用