Тестирование с Sinon-Chai, что индивидуальный обратный вызов в маршруте Node JS Express с несколькими обратными вызовами вызывается - PullRequest
0 голосов
/ 18 февраля 2019

Я относительно новичок в Узле и Синоне.Это приложение было сделано с помощью Express, и я использую Mocha, Chai и Sinon.Используя Sinon-Chai, я тестирую маршруты POST в Express с несколькими обратными вызовами и не могу понять, как проверить второй и последующие обратные вызовы.

Маршрут внутри моего index.js:

var controller = require('./example.controller');
var validator = require('./example.validator');
var router = express.Router();

router.post('/', validator.create, controller.create);

В моем validator.js есть validator.create, который проверяет отправленный параметр:

exports.create = function(req, res, next) {
  var valid = true;
  var errorMessages = [];

  if (req.body.name) {
    patt = /[^a-zA-Z0-9 !@#$%^&*()_+\-=\[\]{};':]/g;
    if (patt.test(req.body.name)) {
      valid = false;
      errorMessages.push("Parameter is not alphanumeric");
    }
  }

  if (valid == false) {
    return res.status(400).json(errorMessages);
  }

  next();
}

В моем controller.js есть controller.create, который создает запись в БД:

exports.create = function(req, res) {
    return Example.create(req.body)
        .then(baseController.respondWithResult(res, 201))
        .catch(baseController.handleError(res));
}

Тесты Синон-Чаи в моем index.spec.js:

var proxyquire = require('proxyquire').noPreserveCache();   

var exampleCtrlStub = {
    create: 'exampleCtrl.create',
};

var exampleValidatorStub = {
    create: 'exampleValidator.create'
}

var routerStub = {
    get: sinon.spy(),
    put: sinon.spy(),
    patch: sinon.spy(),
    post: sinon.spy(),
    delete: sinon.spy()
};

var exampleIndex = proxyquire('./index.js', {
    express: {
        Router() {
            return routerStub;
        }
    },
    './example.controller': exampleCtrlStub,
    './example.validator': exampleValidatorStub
});

describe('POST /api/examples', function() {
    it('should route to example.validator.create', function() {
        routerStub.post
            .withArgs('/', 'exampleValidator.create')
            .should.have.been.calledOnce;
    });
});


describe('POST /api/examples', function() {
    it('should route to example.controller.create', function() {
        routerStub.post
            .withArgs('/', 'exampleCtrl.create')
            .should.have.been.called;
    });
});

Хотя ожидается, что оба теста пройдут, первый тест (validator.create) пройдет, но второй (controller.create) не удается.Я не смог найти способ проверить, что называется controller.create.

1 Ответ

0 голосов
/ 18 февраля 2019

во втором тесте мы не можем пропустить первый аргумент валидатора, используя withArgs.Тест не пройден, так как он ищет метод с этой сигнатурой, которого нет в источнике.

router.post('/', controller.create);

withArgs всегда начинаются с первого, затем второго аргумента и т. Д. Итак, решение состоит в том, чтобывключите валидатор в тест

routerStub.post
  .withArgs('/', 'exampleValidator.create', 'exampleCtrl.create')
  .should.have.been.called;

Ссылка:

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

...