簡體   English   中英

如何使用 supertest 和 chai 捕獲 deferred.reject?

[英]How to catch deferred.reject using supertest and chai?

我正在使用 supertest、chai 和 mocha 來測試我的 Web API 應用程序。 我有以下代碼:

it('should return 500', function(done) {
    this.timeout(30000);
    request(server)
        .get('/some/path')
        .expect(500)
        .end(function(err, res) {
            done();
        });
});

它應該失敗。 get請求中運行的代碼是:

        // Inside method getData
        try {
            // Get data
            // throws error
        } catch (e) {
            // catches error and displays it
            deferred.reject(e);
            return deferred.promise;
        }

    // Other code not in getData method
    dbOps.params.getData(collection, parameter, query).then(
         function (arr) {
            response.send(arr);
         }, function (err) {
            logger.error(err.message);
            response.status(500).send(err.message);
         }
    );

它基本上是deferred.reject(e); 並將錯誤作為 API 的響應發送。 我想趕上deferred.reject(e); 部分並同時繼續.except(500).end(...). 就像是:

catch_deferred(request(server).get('/some/path'))
        .expect(500)
        .end(function(err, res) {
            expect(err).to.equal(null);
            expect(res.body).to.be.an('object').that.is.empty;
            done();

有什么辦法嗎? 我不能使用 try-catch 塊,因為它不是例外。 我也不能 chai 的expect().to.throw()因為沒有拋出異常。

免責聲明:我從不使用 deferred.reject()。

可能的解決方案:使用sinon

如果您希望真正的 deferred.reject()運行並且您只想監視它,您可以使用spy 監控的意思是:知道方法是否被調用,使用什么參數,以及返回值。 例子:

// Preparation: (Disclaimer: I never use Deferred.reject())
const spyDeferredReject = sinon.spy(Deferred, 'reject');
// Do stuff..
// Expectation phase: check whether deferred reject get called.
expect(spyDeferredReject.calledOnce).to.equal(true);
// Check whether deferred reject called with correct argument.
expect(spyDeferredReject.args[0][0]).to.be.an('error');

如果要監視它並確保調用真正的方法,可以使用stub

希望這可以幫助。

暫無
暫無

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

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