2017-03-23 8 views
0

私はいくつかのミドルウェアの単体テストを書く試みで面白いロードブロックを打ってきました。私は実行可能な手段を考え出すことができませんでした。 koaミドルウェアであるジェネレータ機能コアミドルウェア - 発電機並行性テスト

私はいくつかの設定オプションを取り、ジェネレータを返すコンストラクタ関数を持っています。このジェネレータは、要求ごとにインクリメントし、完了したときにデクリメントするクロージャを介していくつかの変数にアクセスします。ここには、私が達成しようとしていることのアイデアを提供するためのコードのサブセットがあります。簡単に言えば

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

    return function *() { 
     connections++ 

     ... 

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

     ... 
    } 
} 

は私がリクエストの最大数が満たされているコールバックを発射する複数の同時「接続」を追跡できるようにしたいです。しかし、私は戻って、この発電機の単一のインスタンスを取得し、一度だけ、単一の要求を模倣し、それを呼び出すことができます私のテストでは、したがって、私は接続を満たすことはできません>最大条件

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; 
}); 

答えて

0

時には、あなたはちょうど良いが必要あなたの答えを夢見る夜の眠り。これは、2つの異なる要求を表す2つの異なるコンテキストを持つ同じジェネレータを呼び出し、後者に対してテストするための値を格納するという単純な問題でした。カウンタは、私がミドルウェアのチェーン(応答)を返すことはなかったので、依然として増加しています。それは偽の並行処理のほうがはるかです。

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;