unit-testing - 如何在 Jest 中链接具有多个异常的 promise

原文 标签 unit-testing jestjs es6-promise

我正在尝试找到一种干净的方法来编写集成测试(使用真实资源的 jest 单元测试)和使用 promise 链接的 jest,但我可以理解它。
除了正确嵌套 promise 之外,我也不知道如何解决这两个问题:

  • 如何有不同expects在不同的 promise 中被开 Jest 正确地接受了
  • 即使有异常
  • 也总是在清理资源的情况下进行拆解

    我想链接 4 个函数,类似于 Act - Arrange - Assert 模式。
    问题是这些功能对 f.e. 有异步调用。一个数据库,可以有期望。
    为了更好地理解这里是一些伪代码,这在我的脑海中是如何看待的。这只应该提供对问题的更好理解。
    const setupResources =  () =>  new Promise(resolve => {
      //async calls to a database to setup a test
      await dynamoDBClient.put(params).promise();
      // returns data which are necessary for the other steps
      resolve(data);
    });
    
    const act = (data) => new Promise(resolve => {
      // doing some stuff
      const otherdata = {data};
        // calling some endpoint asyc
       const result = await axios.post(
                  `https://restapi.com/test`,
                  JSON.stringify(otherdata),
              );
      // some expects
      expect(result.status).toBe(200);  
    
      // again some data which will be needed in the other steps
      resolve({someInformation: 'info', data}) ;
    });
    
    const assertIt = (data) => {
      const prarams = {/*db related data*/}
      new Promise(resolve=>{
          const dbdata = await dynamoDBClient.get(params).promise();
    
          // some expectation
          expect(dbdata).toBe(data.data);
          resolve();
     })
    
    };
    
    const tearDown = (data) => {
      // cleanup of data base trash which should always happen
      await dynamoDBClient.delete(data.params).promise();
    };
    
    如果有意义的话,实际的测试应该看起来像这样。
    it('test',()=>{
    return setupResources()
            .then(act(data))
            .then(assertIt(data))
            .finally(teardown(data));
    })
    

    最佳答案

    async..await是原始 promise 的替代品,无需使用 then .使用new Promise与现有的 promise 是一种反模式。 async 的问题之一函数解决的是,需要在 promise 链中可用的数据不需要通过整个链传递,它可以声明为链可用范围内的变量。
    它应该是:

    const setupResources = async () => {
      await dynamoDBClient.put(params).promise();
      ...
      return data;
    });
    
    和测试:
    it('test', async ()=> {
      let data;
    
      try {
        data = await setupResources();
        ...
       } finally {
         await teardown(data);
       }
    });
    
    安装和拆卸是 beforeEach 的任务和 afterEach block 解决。如果需要将它们提取到可重用的函数中,可以通过上下文对象共享公共(public)数据,如所示 here .

    关于unit-testing - 如何在 Jest 中链接具有多个异常的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63176679/

    相关文章:

    unit-testing - 重复测试用例

    unit-testing - 自动化测试方法

    javascript - Jest 模拟内部函数

    javascript - 如何兑现 promise ?

    javascript - 如果失败,Puppeteer 如何延迟重试 url 获取

    function - 如何在 D 中模拟标准库函数

    javascript - 如何获得在React和Jest的循环内运行的组件的单元测试覆盖率

    node.js - 用 Jest 和 Enzyme 测试 React Router

    jestjs - Jest + enzyme 测试 : how to ensure a certain function is passed as prop to a component

    javascript - promise GET 调用 rest api : can't get a valid signature