Как поймать deferred.reject с помощью supertest и chai? - PullRequest
0 голосов
/ 29 мая 2020

Я использую 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, потому что это не исключение. Также я не могу expect().to.throw() chai, потому что не возникает исключения.

1 Ответ

0 голосов
/ 01 июня 2020

Отказ от ответственности: Я никогда не использую 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');

Вы можете использовать заглушку , если хотите контролировать его и убедиться, что вызывается реальный метод , а не .

Надеюсь, это поможет.

...