JS тестирование промежуточного программного обеспечения возвращается далее () - PullRequest
0 голосов
/ 25 октября 2018

У меня есть такой промежуточный класс

// code.js
function validation(req, res, next) {
    if (validationLogic(req)) {
        res.send(400);
        return next(false);
    }
    return next();
}

// code.test.js
describe('validation', () => {
    describe('when req is valid', () => {
        //setting up req, res, next stub

        //some other test

        //HERE IS MY QUESTION, how do I text that validation returns next(), and not next(false)
        it('return next(), and next() is called exactly once', () => {
            const spy = sinon.spy();
            nextStub = spy;
            const result = validation(reqStub, resStub, nextStub);
            assert(spy.calledOnceWithExactly());
            assert(result === nextStub()); // both of this
            assert(result === nextStub(false)); // and this line passed
        });
    });
});

Я пытался проверить, возвращает ли моя функция validation next(), а не next(false).Но в тесте похоже, что только assert(spy.calledOnceWithExactly()) может проверить параметр в next.Но строка, следующая за assert(result === nextStub()), не может ничего проверить, кроме того, что результат фактически получен из функции next()

Достаточно ли assert(spy.calledOnceWithExactly()) или есть другой способ проверить это?

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Чистый способ сделать это - использовать expectation, чтобы проверить, что next был вызван один раз с точными аргументами и что результат возвращается из validation:

it('return next(), and next() is called exactly once', () => {
  const expectation = sinon.mock().once().withExactArgs().returns('called with no args');
  nextStub = expectation;
  const result = validation(reqStub, resStub, nextStub);
  expectation.verify();  // SUCCESS
  assert(result === 'called with no args');  // SUCCESS
});
0 голосов
/ 25 октября 2018

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

it('return next(), and next() is called exactly once', () => {
    const nextStub = (arg) => (arg === false ? arg : 'I was called!');
    const result = validation(reqStub, resStub, nextStub);
    
    assert(result !== false);
    assert(result === 'I was called!');
});

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

https://sinonjs.org/releases/v7.0.0/spy-call/

...