Проверка с помощью Sinon-Chai того, что вызывается отдельный обратный вызов в маршруте Node JS Express с несколькими обратными вызовами

Я относительно новичок в Node и Sinon. Это приложение было сделано с помощью 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));
}

Тесты Sinon-Chai в моем 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.


person Bolu    schedule 18.02.2019    source источник


Ответы (1)


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

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

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

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

Ссылка:

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

person deerawan    schedule 18.02.2019
comment
Идеально! Это определенно помогает. Спасибо. - person Bolu; 19.02.2019