Как издеваться и проверять замыкания с мокко, чаем и синоном - PullRequest
1 голос
/ 28 апреля 2019

У меня есть простое промежуточное ПО Node.js, которое я хотел бы проверить, правильно ли оно обрабатывается.

Простое промежуточное ПО

module.exports = (argumentOne, argumentTwo) => (req, res, next) => {
  if (!argumentOne || !argumentTwo) {
    throw new Error('I am not working');
  };

  req.requestBoundArgumentOne = argumentOne;
  req.requestBoundArgumentTwo = argumentTwo;

  next();
};

Я бы хотел протестировать это промежуточное ПО, используя mocha, chai и sinon, но я просто не могу понять, как проверить эту внутреннюю функцию.

Я попробовал следующий подход

describe('[MIDDLEWARE] TEST POSITIVE', () => {
  it('should work', () => {
    expect(middleware('VALID', 'TESTING MIDDLEWARE')).to.not.throw();
  });
});

describe('[MIDDLEWARE] TEST NEGATIVE', () => {
  it('shouldn\'t work', () => {
    expect(middleware('INVALID')).to.throw();
  });
});

В моем ПОЛОЖЕНИИ ДЛЯ ТЕСТА я знаю, что этот код действителен, но все равно выдает следующую ошибку

AssertionError: expected [Function] to not throw an error but 'TypeError: Cannot set property \'requestBoundArgumentOne\' of undefined' was thrown

1 Ответ

1 голос
/ 28 апреля 2019

При просмотре кода, который вы опубликовали, ваша функция возвращает другую функцию, которую необходимо вызвать.Таким образом, тест должен быть написан следующим образом:

describe('middleware', () => {
  let req, res, next;

  beforeEach(() => {
    // mock and stub req, res
    next = sinon.stub();
  });

  it('should throw an error when argumentOne is undefined', () => {
    const fn = middleware(undefined, 'something');
    expect(fn(req, res, next)).to.throw();
  });

  it('should throw an error when argumentTwo is undefined', () => {
    const fn = middleware('something', undefined);
    expect(fn(req, res, next)).to.throw();
  });

  it('should call next', () => {
    const fn = middleware('something', 'something');
    fn(req, res, next);
    expect(next.calledOnce).to.be.true;
  });
});

Чтобы правильно проверить успешный вариант, вам нужно будет заглушить значения для req и res.

...