【问题标题】:Jest not executing test case inside forEach function开玩笑没有在 forEach 函数中执行测试用例
【发布时间】:2020-04-20 10:09:00
【问题描述】:

我试图在 forEach 块内的循环中执行测试用例,但我正在迭代的变量总是抛出未定义的。在 beforeAll 块中,我使用 await 从数据库中获取数据,并将对象数组分配给一个变量,以便我可以迭代数组并为每个对象执行测试。但是当我尝试这样做时,它总是抛出 TypeError: Cannot read property 'forEach' of undefined,谁能说我在这里做错了什么?

sample.test.ts

describe('Test suite ', () => {
  let d: any;
  beforeAll(async () => {
    connectToDatabase();
    d = await r.retriveDataFromDb1();
  }, 200000);
  describe('Test suite 1', () => {
    d.forEach(function(v: any) {
      it('test case', async () => {
        console.log(v);
      }, 20000);
    });
  });
});

【问题讨论】:

    标签: javascript node.js jestjs


    【解决方案1】:

    Jest 测试可以异步运行,但它们是同步定义的。 beforeAll 仅在测试开始时执行,此时应该知道测试。

    它可以是动态创建断言的单个测试:

      let d: any;
      beforeAll(async () => {
        connectToDatabase();
        d = await r.retriveDataFromDb1();
      }, 200000);
    
      describe('Test suite 1', () => {
        it('test case', () => {
          d.forEach((v: any) => {
            expect(some).toBe(valueThatDependsOnV);
          });
        }, 20000);
      });
    

    或者异步设置应该在global setup允许的地方进行:

    // setup.js
    module.exports = async () => {
      connectToDatabase();
      global.__d__ = await r.retriveDataFromDb1();
    };
    
    // teardown.js
    module.exports = async function () {
      // disconnect from database
    };
    

    __d__ 将在所有测试中可用:

      describe('Test suite 1', () => {
        __d__.forEach((v: any) => {
          it('test case', async () => {
            ...
          }, 20000);
        });
      });
    

    【讨论】:

    • 尝试了您的第一个解决方案,但它在循环中发生第一次失败时退出,但我需要变量 d 中所有可用对象的结果(其中 d 是 [{}] 的类型)。 secong 解决方案在我的场景中是不可能的,因为配置可能因模块而异。嵌套测试用例可以开玩笑吗?
    • 对于第一种情况,您可以使用 try..catch 收集错误并在测试结束时重新抛出它们,它不干净但它应该可以工作并且可以根据需要重写为辅助函数这多次。至于第二种情况,您可以在全局设置中为每个测试文件分配数据,并用绝对测试路径对其进行标识,因此在测试中可以将其访问为__d__[__filename],虽然不干净但可以使用。嵌套案例是指itit 内吗?这是不允许的,同样,Jest 在运行它们之前应该知道所有测试,因此在测试运行开始后您不能定义它们。
    猜你喜欢
    • 2017-10-20
    • 2019-07-23
    • 2017-11-28
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    相关资源
    最近更新 更多