Модульное тестирование с Sinon: Как мне проверить переменную внутри Callback? - PullRequest
0 голосов
/ 05 мая 2019

Я делаю юнит-тест с Синоном, чтобы хотя бы попытаться что-то пройти, и мне не повезло. Я не смог ничего найти в Интернете.

У меня 2 проблемы:

1) Я пытаюсь получить простой ответ, но он не может сказать, что spy - это false. Когда я регистрирую это, он говорит, что это true.

2) Я хочу проверить шаблон в функции обратного вызова, равной «Новый заголовок». Я не могу понять, как передать req, res и next в router.get

router.js

const express = require('express'), router = express.Router();

router.get('/', (req, res, next) => {
var template = {
  title: req.title,
  item: req.item,
  description: 'N/A'
};
res.render('index', template);

module.exports = router;
});

router.spec.js

const router = require('./router');
var res = {};
var req = {
  title: 'New Title',
  item: 'Blank Item'
};
var template = {
  title: req.title,
  item: req.item,
  description: 'N/A'
};


it('1) should call the response', ()=>{
 var spy = sinon.spy(route, 'get');
 route.get('/', ()=>{});
 console.log(spy.calledOnce); // equals true
 assert(spy.calledOnce).toBeTruthy();
 spy.restore();
});

it('2) should return a status 200', ()=>{
 var stub = sinon.stub().yield([req, res, next]);
 route.get('/', stub); // main problem
 assert.equal(200, res.statusCode);
 stub.restore();
});

Я хочу получить доступ к обработчику маршрута, чтобы я мог провести дальнейшее тестирование. Где и как я могу реализовать обработку маршрутов в этой ситуации?

1 Ответ

1 голос
/ 09 мая 2019

Экспресс-приложение для маршрутизации обычно лучше всего тестировать с интеграционным тестированием, а не модульным тестированием, которое вы пытались выполнить. Supertest может использоваться в качестве библиотеки.

Еще одно улучшение, которое мы можем сделать, - разделить логику для генерации шаблона в другой файл. И для этого сервиса мы можем провести на нем модульное тестирование. Можно использовать мокко или шут .

Пример:

const request = require('supertest');
const express = require('express');
const service = require('./service'); // our new service file
const app = express();

app.get('/', function(req, res) {
  const template = service.getTemplate(req);
  res.render('index', template);
});

// integration test, ideally must be separated into a test file e.g. app-integration-test.js

request(app)
  .get('/')
  .expect('Content-Type', /json/)
  .expect('Content-Length', '15')
  .expect(200)
  .end(function(err, res) {
    if (err) throw err;
  });


// service.js

function getTemplate(req, res) {
  return {
    title: req.title,
    item: req.item,
    description: 'N/A'
  };
}

// service-unit-test.js

describe('service test', function() {
  it('returns template correctly', function() {
    const req = {
      title: 'someone',
      item: 'my item',
    }
    const template = service.getTemplate(req);

    expect(template).to.eql({
      title: 'someone',
      item: 'my item',
      description: 'N/A'
    })
  })
})

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

...