簡體   English   中英

使用Mocha和Supertest測試Express錯誤

[英]Testing Express errors with Mocha and Supertest

例如,我必須在驗收測試中測試服務器錯誤(Express),這些錯誤不能(或不應該)與響應一起發送

錯誤:發送后無法設置標頭。

使用錯誤處理程序捕獲錯誤並使用5XX代碼進行響應將在此處提供有價值的反饋,但問題是已經發送了標頭。

這種錯誤可能是非關鍵的,很難發現,通常它們是從日志中找出來的。

規格是

it('should send 200', function (done) {
    request(app).get('/').expect(200, done);
});

測試的應用程序是

app.get('/', function (req, res, next) {
    res.sendStatus(200);
    next();
});

app.use(function (req, res) {
    res.sendStatus(200);
});

在類似情況下,在Express app實例和請求測試庫(即Supertest)之間進行通信的最合適方式是什么?

問題不僅限於Supertest。 如果有包可以解決Supertest無法解決的問題,也可以考慮它們。

嘗試只設置狀態代碼而不發送它,並避免發送兩次拋出錯誤使用res.status()

正如快遞文件所述

設置響應的HTTP狀態。 它是Node的response.statusCode可鏈接別名。

恕我直言,如果要檢測它在一個終端到端到端 (E2E)測試工具,如supertest (或 ),你必須處理快遞錯誤並發送正確的輸出(500狀態錯誤,一些消息...),以允許檢測它。

或者使用單元測試來測試控制器函數不會使用chai或本機斷言拋出任何錯誤。

在這里回答了類似的問題。 “無法在設置后設置標頭”錯誤應該通過表示為未處理的異常來引發。 因此,您應該能夠通過進程引發的unhandledException事件來訪問它。

然而,由於時間安排,這更加棘手。 您的測試用例期望函數和完成函數將排在第一個res.statusCode調用之后的tick上的事件循環上進行處理。 不幸的是,res.statusCode的下一次調用可能會在不確定的時間后發生。 例如,如果第二個路由處理程序調用一個非常慢的Web服務或db然后調用res.statusCode,該怎么辦?

考慮到這一點,你的選擇非常困難。 蠻力的方法是在測試代碼中等待一段確定的時間,然后檢查。 它有效但緩慢且不確定,這將導致您的測試不穩定。

另一種選擇是檢查您在Express中可能具有的任何檢測代碼。 如果您使用express中的代碼來保存各種路由處理程序的進程調用數量指標,則可以將這些指標公開給測試代碼。 然后,您完成測試的一個條件是進程中路由調用的所有指標都是0.第二個選項將允許您編寫確定性測試並且速度更快,因為您可以輪詢指標。

最后的選擇是通過單元測試來處理這個測試用例。 這可能是最好的解決方案,因為它是確定性的,不需要任何類型的輪詢。 但是,缺點是您需要知道兩個函數都按順序調用,這會導致您嘗試在測試代碼中重新創建用於調用路由處理程序的邏輯。

我使用HAPI而不是Express來做到這一點,但我解決了同樣的問題。 我使用外部庫來進行調用(如請求 - 承諾)並且它有效。 捕獲請求 - 承諾響應中的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM