2013-07-26 30 views
2

假設我有一些測試Web服務器的單元測試。由於我不想在這裏討論的原因(外部範圍;-)),每個測試都需要一個新啓動的服務器。在單元測試中關閉Node.js http服務器

只要我不發送請求到服務器,一切都很好。但是一旦我這樣做,對http服務器的調用close函數就無法按預期工作,因爲所有發出的請求都會導致保持活動的連接,因此服務器在實際關閉前等待120秒。

當然這是不能接受的運行測試。

目前,唯一的解決方案,我想看到的是無論是

  • 保持連接超時設置爲0,所以close通話將實際關閉服務器,
  • 或每次啓動服務器位於不同的端口上,但當您進行大量測試時,這變得很難處理。

如何處理這種情況的任何其他想法?

PS:我有一個要求How do I shutdown a Node.js http(s) server immediately?前一陣子,發現一個可行的辦法來解決它,但因爲它似乎這種解決方法並不在任何情況下可靠地運行,因爲我得到了奇怪的結果,不時。

+1

如何在第一個地方啓動服務器?您是從節點還是從其他腳本運行node.js服務器? – jsalonen

+0

另外我明白你可能有嚴格的要求,但是你真的需要在每次測試後重新啓動服務器嗎?我的意思是你能重構一些東西,讓你可以在同一臺服務器上運行多個測試嗎? – jsalonen

+0

使用通常的'http.createServer.listen'東西,使用Node.js以編程方式啓動服務器。不幸的是,我* DO *需要在每個測試中都有一個新實例: - / –

回答

1
function createOneRequestServer() { 
    var server = http.createServer(function (req, res) { 
     res.write('write stuff'); 
     res.end(); 
     server.close(); 
    }).listen(8080); 
} 

你也可以考慮使用過程到餐桌的過程,並殺死他們已在該測試過程之後。

var child = fork('serverModuleYouWishToTest.js'); 

function callback(signalCode) { 
    child.kill(signalCode); 
} 

runYourTest(callback); 

這種方法是可取的,因爲它不要求你寫你的服務器的特殊情況下,以服務只有一個要求,並保持你的測試代碼和產品代碼100%無關。