Sinon Stub для промежуточного ПО, которое находится внутри функции - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть промежуточное ПО, которое находится внутри параметризованной функции, подобной этой

export const getUserAuthenticated = (var1, var2, var3) => {
  return async (req, res, next) => {
    try {
      //some logic
      next();
    } catch (err) {
      next(err);
    }
  };
};

, и я звоню по маршруту, как этот

Router.get('/', getUserAuthenticated(var1val,var2val,vrl3val),getUsers);

Я хочу пропустить промежуточное ПО getUserAutheticated в sinon

1 Ответ

0 голосов
/ 13 апреля 2020

Полагаю, вы хотите написать несколько интеграционных тестов для него. Я использую Link Seams , чтобы заглушить функцию высокого порядка getUserAuthenticated и супертест в качестве библиотеки интеграционных тестов.

Например,

server.ts:

import express from 'express';
import { getUserAuthenticated } from './middlewares';

const app = express();
const port = 3000;

function getUsers(req, res) {
  const users = [{ name: 'james' }, { name: 'jane' }];
  res.json(users);
}

app.get('/', getUserAuthenticated('var1val', 'var2val', 'vrl3val'), getUsers);

app.use((err, req, res, next) => {
  res.status(500).send('Internal server error');
});

if (require.main === module) {
  app.listen(port, () => {
    console.log(`HTTP server is listening on http://localhost:${port}`);
  });
}

export { app };

middlewares.ts:

export const getUserAuthenticated = (var1, var2, var3) => {
  return async (req, res, next) => {
    try {
      // some logic
      if (!req.get('token')) {
        throw new Error('token required');
      }
      next();
    } catch (err) {
      next(err);
    }
  };
};

server.test.ts:

import request from 'supertest';
import sinon from 'sinon';
import proxyquire from 'proxyquire';

describe('61143580', () => {
  it('should throw error', (done) => {
    const { app } = require('./server');
    request(app)
      .get('/')
      .expect(500)
      .end((err, res) => {
        if (err) return done(err);
        console.log(res.text);
        sinon.assert.match(res.text, 'Internal server error');
        done();
      });
  });
  it('should get users', (done) => {
    const middlewaresStub = {
      getUserAuthenticated: sinon.stub().callsFake((var1, var2, var3) => {
        return async (req, res, next) => {
          next();
        };
      }),
    };
    const { app } = proxyquire('./server', {
      './middlewares': middlewaresStub,
    });
    request(app)
      .get('/')
      .expect(200)
      .end((err, res) => {
        if (err) return done(err);
        console.log(res.body);
        sinon.assert.match(res.body, [{ name: 'james' }, { name: 'jane' }]);
        sinon.assert.calledWithExactly(middlewaresStub.getUserAuthenticated, 'var1val', 'var2val', 'vrl3val');
        done();
      });
  });
});

Я не заглушил функцию getUserAuthenticated в первом тестовом примере, это выдаст ошибку в промежуточном программном обеспечении.

результаты интеграционного теста с отчетом о покрытии:

  61143580
Internal server error
    ✓ should throw error (471ms)
[ { name: 'james' }, { name: 'jane' } ]
    ✓ should get users (63ms)


  2 passing (556ms)

----------------|---------|----------|---------|---------|-------------------
File            | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------------|---------|----------|---------|---------|-------------------
All files       |   85.71 |       50 |   83.33 |      85 |                   
 middlewares.ts |    87.5 |       50 |     100 |   85.71 | 8                 
 server.ts      |   84.62 |       50 |   66.67 |   84.62 | 19,20             
----------------|---------|----------|---------|---------|-------------------

исходный код: https://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/61143580

...