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

问题描述 投票:0回答:1

我们正在使用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 protected]' && 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);

是否有更清洁/更好/更有效/高性能/等方式实现这一目标?

javascript typescript supertest web-api-testing
1个回答
0
投票

我在过去的项目瓶颈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 protected]' && m.mail_read == 0)[0];
  } else {
    mail = undefined;
  }
}

希望能帮助到你

© www.soinside.com 2019 - 2024. All rights reserved.