代码之家  ›  专栏  ›  技术社区  ›  Mohsen

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

  •  0
  • Mohsen  · 技术社区  · 4 年前

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

    这是我的代码:

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

    但它在以下位置显示了错误消息: [] :

    元素访问表达式应该包含一个参数。

    1 回复  |  直到 4 年前
        1
  •  1
  •   T.J. Crowder    4 年前

    因为玩笑测试 运行时 测试时,它们只能访问运行时信息。您试图使用一种类型,即编译时信息。TypeScript应该已经在为您执行此操作的类型方面了。(稍后将对此进行详细介绍。)

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

    • 如果 这对我来说是有效的 getAll 要返回空数组(因为没有任何要获取的实体),测试 不能 告诉你数组 会的 Entity 如果不是空的话,里面的元素。它只能告诉你它有一个数组。

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

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

      当心 然而,所有这些都需要 每一个 关于空数组返回 true ,所以空数组问题再次出现。

    如果您的Jest测试是用TypeScript编写的,那么您可以通过确保TypeScript测试 getAll 的返回值:

    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看到数组包含非- 实体 对象


    但是 jonrsharpe has a good point :此测试可能不适用 有用的 而不是测试应该存在的特定值。