1

在我的 mocha-test 套件中,我想测试一个在后台进行异步调用的功能。我怎样才能等到异步调用完成?

例如,我打了两个背靠背的邮政电话。第一个 post 调用也在内部进行异步调用,直到该异步操作完成,第二个 post 调用不会通过。

我需要以下任一:

1) 在两个 post 调用之间放置一个延迟,以确保第一个 post 中的异步部分是完整的。
2) 重复进行第二次 post call 直到它通过。
3) 或者如何通过 mocha-chai 测试异步调用?

下面是示例:

describe('Back to back post calls with asynchronous operation', ()=> {

            it('1st and 2nd post', (done) => {
                chai.request(server)
                .post('/thisis/1st_post')
                .send()
                .end((err, res) => {
                 expect(res.statusCode).to.equal(200);

                 /* HERE I Need A Delay or a way to call                   
               the below post call may be for 5 times */                       

                 chai.request(server)
                .post('/thisis/second_post')
                .send()
                .end((err, res) => {
                 expect(res.statusCode).to.equal(200);


                });

                done();
                });
            });         

        });

有没有办法处理这个?请帮忙。

谢谢。

4

1 回答 1

2

为了使用 mocha 测试异步函数,您有以下可能性

done仅在执行序列中的最后一个回调之后使用

it('1st and 2nd post', (done) => {
  chai.request(server)
    .post('/thisis/1st_post')
    .send()
    .end((err, res) => {
      expect(res.statusCode).to.equal(200);

      /* HERE I Need A Delay or a way to call
    the below post call may be for 5 times */

      chai.request(server)
        .post('/thisis/second_post')
        .send()
        .end((err, res) => {
          expect(res.statusCode).to.equal(200);

          //call done only after the last callback was executed
          done();
        });
    });
});

使用done带有承诺的回调

describe('test', () => {
  it('should do something async', (done) => {
    firstAsyncCall
       .then(() => {
          secondAsyncCall()
            .then(() => {
              done() // call done when you finished your calls
            }
       })
  });
})

经过适当的重构后,您将得到类似

describe('test', () => {
  it('should do something async', (done) => {
    firstAsyncCall()
      .then(secondAsyncCall())
      .then(() => {
        // do your assertions
        done()
      })
      .catch(done)
  })
})

使用async await,更清洁

describe('test', () => {
  it('should do something async', async () => {
    const first = await firstAsyncCall()
    const second = await secondAsyncCall()

    // do your assertion, no done needed
  });
})

另一个要记住的时刻是--timeout运行 mocha 测试时的争论。默认情况下 mocha 等待2000毫秒,当服务器响应较慢时,您应该指定更大的数量。

mocha --timeout 10000

于 2018-03-09T12:21:26.957 回答