Как правильнее будет написать тест для контроллера с Redis?

Есть контроллер в котором осуществляется пользователя из системы.
// controllers/auth/signOut
const redisModel = require('../../models/redis');

module.exports = async (req, res) => {
  const user = req.user;

  // check in redis id

  const checkInRedis = await redisModel.get(`id.${ user.id }`);

  // if exist, delete id

  if ( checkInRedis ) {
    redisModel.del(`id.${ user.id }`)
  }

  res.status(200).json({ result: 'ok' })
};


// models/redis
const redis = require('redis');
const set =   require('./set');
const get =   require('./get');
const del =   require('./del');

const REDIS_PORT = process.env.REDIS_PORT || 6379;

const clientRedis = process.env.REDIS_TEST ?  redis.createClient(REDIS_PORT);

module.exports = {
  set: set(clientRedis),
  get: get(clientRedis),
  del: del(clientRedis)
};


// models/redis/get
module.exports = clientRedis => key => {
  return new Promise((resolve, reject) => {
    clientRedis.get(key, (err, reply) => {
      if (err) reject(err);

      resolve(reply);
    })
  });
};

Аналогично для del

Нашел пакет для мока redis.
https://www.npmjs.com/package/redis-mock

Как правильно его применить в данном случае
require('dotenv').config();

const express = require('express');
const request = require('supertest');
const bodyParser  = require('body-parser');
const redis  = require('redis-mock');

const auth = require('../../../../server/controllers/auth');
const { i18next, i18nextMiddleware } = require('../../../i18n-server');

const app = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.use(i18nextMiddleware);

app.post(
  '/',
  (req, res, next) => {
    if (req.body.id && req.body.type) {
      req.user = {
        id: req.body.id,
        type: req.body.type
      };
    }

    next();
  },
  auth.signOut
);

describe('signOut', () => {
  it('success', done => {
    i18next.on('initialized', () => {
      request(app)
        .post('/')
        .set('Accept-Language', 'en')
        .type('application/x-www-form-urlencoded')
        .send({
          id: 1,
          type: 'manager'
        })
        .end((err, res) => {
          if (err) return done(err);

          done();
        });
    });
  })
});


Ввести переменную типа process.env.REDIS_TEST и менять пакет при создании редис клиента ?
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
RazerVG
@RazerVG Автор вопроса
FrontEnd
Нужно подключить mock
require('dotenv').config();

const express     = require('express');
const request     = require('supertest');
const bodyParser  = require('body-parser');
const redisMock   = require('redis-mock');
const redis       = require('redis');

const auth = require('../../../../server/controllers/auth');
const { i18next, i18nextMiddleware } = require('../../../i18n-server');

jest.spyOn(redis, 'createClient').mockImplementation(redisMock.createClient);

const app = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.use(i18nextMiddleware);

app.post(
  '/',
  (req, res, next) => {
    if (req.body.id && req.body.type) {
      req.user = {
        id: req.body.id,
        type: req.body.type
      };
    }

    next();
  },
  auth.signOut
);

describe('signOut', () => {
  it('success', done => {
    i18next.on('initialized', () => {
      request(app)
        .post('/')
        .set('Accept-Language', 'en')
        .type('application/x-www-form-urlencoded')
        .send({
          id: 1,
          type: 'manager'
        })
        .end((err, res) => {
          if (err) return done(err);

          expect(res.status).toBe(200);
          expect(res.body.result).toBe('ok');

          done();
        });
    });
  });

  afterAll(() => {
    redis.closeInstance();
  });
});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы