Модульное тестирование express. js маршрутов - PullRequest
2 голосов
/ 30 апреля 2020

Я новичок в express и очень плохо знаком с модульным тестированием. Рассмотрим следующий код:

var express = require('express');
var router = express.Router();

var bookingsController = require ("../controllers/bookings");

router
   .route('/')
   .get(bookingsController.bookings_get)
   .post(bookingsController.bookings_post)


router
   .route('/:id')
   .get(bookingsController.bookings_get_id)
   .put(bookingsController.bookings_put_id)
   .delete(bookingsController.bookings_delete_id)

module.exports = router;

Какой правильный / рекомендуемый способ написания модульных тестов для этого? Я хотел бы иметь возможность, например, проверить, что router.route('/:id') не принимает вызовы POST.

Я знаю, что могу сделать это с супертестом, но я считаю, что это будет считаться интеграционным тестом, поскольку супертест Запустите приложение и запустите тест.

Я прочитал и перепробовал несколько node.js / express. js тестирований, но не смог найти ответ на этот вопрос. Любые указатели на существующие учебники приветствуются. Прямых ответов здесь, даже больше:)

1 Ответ

1 голос
/ 02 мая 2020

Вот решение для модульного тестирования, использующее функцию sinon.js, чтобы заглушить express.Router и сделать утверждения.

router.js:

var express = require('express');
var router = express.Router();

var bookingsController = require('./controllers/bookings');

router
  .route('/')
  .get(bookingsController.bookings_get)
  .post(bookingsController.bookings_post);

router
  .route('/:id')
  .get(bookingsController.bookings_get_id)
  .put(bookingsController.bookings_put_id)
  .delete(bookingsController.bookings_delete_id);

module.exports = router;

./controller/bookings.js:

module.exports = {
  bookings_get() {},
  bookings_post() {},
  bookings_get_id() {},
  bookings_put_id() {},
  bookings_delete_id() {},
};

router.test.js:

var sinon = require('sinon');
var express = require('express');

describe('61529619', () => {
  it('should pass', () => {
    const routerStub = {
      route: sinon.stub().returnsThis(),
      post: sinon.stub().returnsThis(),
      get: sinon.stub().returnsThis(),
      put: sinon.stub().returnsThis(),
      delete: sinon.stub().returnsThis(),
    };
    sinon.stub(express, 'Router').callsFake(() => routerStub);
    require('./router');
    sinon.assert.calledWith(routerStub.route, '/');
    sinon.assert.calledWith(routerStub.route, '/:id');
    sinon.assert.calledWith(routerStub.get, sinon.match.func);
    sinon.assert.calledWith(routerStub.post, sinon.match.func);
    sinon.assert.calledWith(routerStub.put, sinon.match.func);
    sinon.assert.calledWith(routerStub.delete, sinon.match.func);
  });
});

Результаты модульных испытаний со 100% покрытием:

  61529619
    ✓ should pass (869ms)


  1 passing (881ms)

----------------------|---------|----------|---------|---------|-------------------
File                  | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------------------|---------|----------|---------|---------|-------------------
All files             |     100 |      100 |       0 |     100 |                   
 61529619             |     100 |      100 |     100 |     100 |                   
  router.js           |     100 |      100 |     100 |     100 |                   
 61529619/controllers |     100 |      100 |       0 |     100 |                   
  bookings.js         |     100 |      100 |       0 |     100 |                   
----------------------|---------|----------|---------|---------|------------------
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...