使用Supertest限制每分钟的请求数

时间:2018-09-03 13:16:57

标签: javascript typescript supertest web-api-testing

我们正在将supertestTypescript结合使用以测试API。 对于其中的某些电子邮件(例如,用户注册,更改密码等),会发送一个用于确认的电子邮件地址(用户确认令牌,重置密码令牌等)。

为了实现这一目标,我们决定使用GuerillaMail,因为它是具有API的简单一次性电子邮件客户端。在完成前提条件(使用电子邮件设置电子邮件)之后,以下代码在两种情况下起作用:

private async getEmailId(sid_token: string, emailType: EmailType): Promise<string> {
        var mail;
        var mailToken = this.getSidToken(sid_token);

        //Keep trying until the email gets in the inbox
        // Infinite loop is prevented by the jest framework timeout
        while (!mail) {
            const result = await request(this.guerillaMailApiUrl)
                .get('')
                .query({
                    f: 'check_email',
                    seq: 0,
                    sid_token: mailToken
                });
            if (result.body.list != undefined) {
                mail = result.body.list.filter(m => m.mail_subject == emailType && m.mail_from == 'email@domain.com' && m.mail_read == 0)[0];
            }
            else {
                mail = undefined;
            }
        }
        return mail.mail_id;
    }

但是,它限制为每分钟20个请求,该限制导致测试失败。

有没有办法限制请求的数量?

最新编辑: 我通过创建延迟使其起作用:

async delay(ms: number) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

并在退出while循环之前立即调用它:

await this.delay(5000);

是否有一种更清洁/更精细/效率更高/性能更高的方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

我在过去的项目中使用过的一个限速器 Bottleneck https://www.npmjs.com/package/bottleneck

const limiter = new Bottleneck({
  maxConcurrent: 20,
  minTime: 60000
});

while (!mail) {
  // set limiter here
  const result = await limiter.schedule(() => request(this.guerillaMailApiUrl)
    .get('')
    .query({
      f: 'check_email',
      seq: 0,
      sid_token: mailToken
    }));
  if (result.body.list != undefined) {
    mail = result.body.list.filter(m => m.mail_subject == emailType && m.mail_from == 'email@domain.com' && m.mail_read == 0)[0];
  } else {
    mail = undefined;
  }
}

希望有帮助