【问题标题】:Koa middleware - generator concurrency testingKoa 中间件 - 生成器并发测试
【发布时间】:2017-08-16 17:09:06
【问题描述】:

我在尝试为某些中间件编写单元测试时遇到了一些有趣的障碍,因为我似乎无法想出一种可行的方法来伪造一个生成器函数的两个并发连接,这是一个片段koa 中间件。

我有一个构造函数,它接受一些设置选项并返回一个生成器。这个生成器可以通过闭包访问一些变量,每个请求递增,完成时递减。这是代码的子集,可让您了解我要完成的工作。

module.exports = function (options = {}) {
    let connections = 0;
    let {
        max = 100
        ...
    } = options;

    return function *() {
        connections++

        ...

        if (connections > max) {
            connections--;
            // callback here
        }

        ...
    }
}

简单来说,我希望能够跟踪多个同时“连接”,当满足最大数量的请求时,我会在其中触发回调。但是,在我的测试中,我返回了这个生成器的一个实例,并且只能在模仿单个请求时调用它,因此我永远无法满足 connections > max 条件

it("Should trigger callback when max connections reached", () => {
    const gen = middleware({
        max: 1,
        onMax: function (current, max) {
            this.maxReached = true;
        }
    }).call(context);

    gen.next();

    expect(context.maxReached).to.be.true;
});

【问题讨论】:

    标签: unit-testing concurrency generator middleware koa


    【解决方案1】:

    有时你只需要睡个好觉就可以梦想你的答案。这只是用两个不同的上下文调用同一个生成器,代表两个不同的请求,并存储一个值来测试后者。计数器仍会增加,因为我从未返回中间件链(响应)来减少。这更像是一种假并发。

    const middleware = limiter({
        max: 1,
        onMax: function (current, max) {
            this.maxReached = true;
        }
    });
    
    middleware.call(reqContext).next();
    middleware.call(secondReqContext).next();
    
    expect(secondReqContext.maxReached).to.be.true;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多