2016-03-11 106 views
0

我正在使用摩卡來測試我寫的Node.js API。我需要摩卡一次發送100個HTTP請求,然後有100個回調等待響應數據。然後,在所有這些調用完成後,我需要運行另一系列100個HTTP請求。摩卡異步請求到Node.js API

我對摩卡的瞭解:每個並排描述函數調用同步運行。在一個描述中,我使用async運行100個HTTP請求(這是大多數Stackoverflow響應告訴我要做的事情)。

現在,我只是讓這些HTTP請求異步運行,每個it應該是異步的,但是等待請求數據

var registeredData = {}; 
describe("Run first 100 HTTP requests...", function() { 
    async.map(calls, function (call, callback) { 
     it('call '+call.num, function(done) { 
      request({ 
       method: 'POST', 
       uri: 'http://127.0.0.1:3000/register', 
       json: { 
        data: { 
         name: call.name, 
         id: call.id 
        } 
       }, 
      }, 
      function (err, res) { 
       expect(res.body).to.exist; 
       registeredData[call.num] = res.body.info; 
       done(); 
      }); 
     }); 
     callback(); 
    }); 
});  
describe("Run next 100 HTTP requests...", function() { 
    async.map(calls, function (call, callback) { 
     it('call '+call.num, function(done) { 
      request({ 
       method: 'POST', 
       uri: 'http://127.0.0.1:3000/getData', 
       json: { 
        data: { 
         dataFor: registeredData[call.num] 
        } 
       }, 
      }, 
      function (err, res) { 
       expect(res.body).to.exist; 
       done(); 
      }); 
     }); 
     callback(); 
    }); 
}); 

基本上當絕對不是這樣的,第一個100點的HTTP請求註冊賬戶,下一個100檢索每個相應的帳戶信息。我不知道什麼時候打電話done()以及何時致電callback()(屬於async.map)。有人知道該怎麼辦?

回答

0

也許我錯了,但我沒有看到這裏要在您的代碼中使用async.map這一點。

鑑於100請求發送給所有的人都在一個單一的測試

如果你的測試用例是「發送100個請求,並測試他們都返回」你有你的測試中使用async

it("Run first 100 HTTP requests...", function (done) { 

    function sendRequest(call, next){ 
    request({ 
     method: 'POST', 
     uri: 'http://127.0.0.1:3000/register', 
     json: { 
      data: { 
      name: call.name, 
      id: call.id 
      } 
     }, 
     }, 
     function (err, res) { 
     if(err){ 
      next(err); 
     } else { 
      expect(res.body).to.exist; 
      // ... more assertions here 
      next(); 
     } 
     }); 
    } 

    async.series(calls, sendRequest, done); 

}); 
... more tests here 

鑑於100元話費清單測試每個單呼

如果你想要做的是有通話清單和有it測試爲他們每個人,那麼你可以只產生一個新的it clojure每個電話。 mocha將註冊it測試,然後執行它們。

var registeredData = {}; 
describe("Run first 100 HTTP requests...", function() { 

    function createCallTest(call){ 
    it('call '+call.num, function(done) { 

     request({ 
     method: 'POST', 
     uri: 'http://127.0.0.1:3000/register', 
     json: { 
      data: { 
      name: call.name, 
      id: call.id 
      } 
     }, 
     }, 
     function (err, res) { 
     expect(res.body).to.exist; 
     registeredData[call.num] = res.body.info; 
     done(); 
     }); 
    }); 
    } 

    // generate one test for each calls entry 
    calls.forEach(function(call){ 

    createCallTest(call); 

    }); 
}); 
... more tests here 
+0

是啊你是對的,我拿出了async.map。但這些請求是一個接一個地發送的。我有兩個終端,一個用於API,另一個用於發送請求的mocha測試,API不是異步接收所有的調用。請求正在阻止每個後續呼叫,直到返回前一個爲止 – Jeremy

+0

如果您想要併發呼叫,建議將它們分組:即使您將它們全部放在一起,通常也可以並行打開最大數量的呼叫。我相信100是遠高於這個上限。 – MarcoL

+0

好吧,我甚至無法獲得2個併發呼叫,雖然 – Jeremy