【问题标题】:How to catch deferred.reject using supertest and chai?如何使用 supertest 和 chai 捕获 deferred.reject?
【发布时间】:2020-05-28 22:44:18
【问题描述】:

我正在使用 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() 因为没有抛出异常。

【问题讨论】:

    标签: javascript node.js mocha.js chai supertest


    【解决方案1】:

    免责声明:我从不使用 deferred.reject()。

    可能的解决方案:使用sinon

    你可以使用spy,如果你想要真正的deferred.reject() 运行并且你只是想监控它。监控的意思是:知道方法是否被调用,使用什么参数,以及返回值。示例:

    // 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,如果你想监控它并确保真正的方法被调用。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-02-11
      • 1970-01-01
      • 2014-12-30
      • 1970-01-01
      • 2017-12-06
      • 2018-10-28
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多