Как заставить ветвь ошибки в тестировании жасмина - node

Я тестирую логику контроллера за конечными точками API на моем сервере node с жасмином - node. Вот как выглядит эта логика контроллера:

var getSummary = function(req, res) {
  var playerId = req.params.playerId;

  db.players.getAccountSummary(playerId, function(err, summary) {
    if (err) {
      logger.warn('Error while retrieving summary for player %d.', playerId, err);
      return res.status(500).json({
        message: err.message || 'Error while retrieving summary.',
        success: false
      });
    } else {
      res.json({success: true, summary: summary});
    }
  });
};

Ниже приведен пример успешного тестирования блока else:

describe('GET /api/players/:playerId/summary', function() {
  it('should return an object summarizing the player account',   function(done) {
    request
      .get('/api/players/' + playerId + '/summary')
      .set('Content-Type', 'application/json')
      .set('cookie', cookie)
      .expect(200)
      .expect('Content-Type', /json/)
      .end(function(err, res) {
        expect(err).toBeNull(err ? err.message : null);
        expect(res.body.success).toBe(true);
        expect(res.body.summary).toBeDefined();
        done();
      });
  });
});

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

Ответ 1

Это зависит от ваших тестов. Если вы хотите только unit test, шпионы - это путь. Вы можете просто заглушить ответ db. Имейте в виду, что в этом случае база данных не называется. Он просто моделируется.

const db = require('./yourDbModel');
spyOn(db.players, 'getAccountSummary').and.callFake(function(id, cb) {
  cb(new Error('database error');
});

request
  .get('/api/players/' + playerId + '/summary')
  .set('Content-Type', 'application/json')
  .set('cookie', cookie)
  .expect(500)
  // ...

Если вам нужны функциональные/интеграционные тесты, вам нужно просто вызвать ваш запрос с неправильными данными, например, идентификатор игрока, которого нет в вашей базе данных.

request
  .get('/api/players/i_am_no_player/summary')
  .set('Content-Type', 'application/json')
  .set('cookie', cookie)
  .expect(500)
  // ...