Как правильно провести юнит-тестирование валидации Joi Schemas? - PullRequest
0 голосов
/ 18 марта 2020

Я создал схему проверки Joi, которая вызывается в моих маршрутах. Однако, когда я запускаю покрытие кода, этот файл НЕ покрывается. Итак, я пытаюсь написать тест для этого.

Validator. js

    const Joi = require('joi');
    module.exports = {
    validateExternalId: (schema, name) => {
    return (req, res, next) => {
      const result = Joi.validate({ param: req.params[name] }, schema);
      if (result.error) {
        return res.status(400).send(result.error.details[0].message);
      }
      next();
    };
  },
schemas: {
    idSchema: Joi.object().keys({
      param: Joi.string().regex(/^[a-zA-Z0-9]{20}$/).required()
    })
  }
};

Validator.test. js

const { validateExternalId, schemas } = require('../../src/helpers/validation');
const app = require('../../src/router')

const mockResponse = () => {
  const res = {};
  res.status = jest.fn().mockReturnValue(res);
  res.json = jest.fn().mockReturnValue(res);
  return res;
};

describe('Testing validateExternalId schema', () => {
  it('It can validate the external Id Regex length', done => {
    const req = {
      params: [
        {
          extClientId: 'abcdefghij0123456789'
        }
      ]
    };

  app.use('/token/:extClientId', validateExternalId(schemas.idSchema, 'extClientId');
    // expect().toHaveBeenCalled();
  });
});

Пожалуйста Go Полегче на МЕНЯ ... Вот моя попытка на тестировании этого валидатора Джой. Я пытался, но мои ожидания не работали, поэтому я прокомментировал это сейчас. любые указатели будут оценены. спасибо

1 Ответ

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

Вот решение для модульного теста:

validator.js:

const Joi = require('joi');

module.exports = {
  validateExternalId: (schema, name) => {
    return (req, res, next) => {
      const result = Joi.validate({ param: req.params[name] }, schema);
      if (result.error) {
        return res.status(400).send(result.error.details[0].message);
      }
      next();
    };
  },
  schemas: {
    idSchema: Joi.object().keys({
      param: Joi.string()
        .regex(/^[a-zA-Z0-9]{20}$/)
        .required(),
    }),
  },
};

validator.test.js:

const { validateExternalId, schemas } = require('./validator');
const Joi = require('joi');

describe('60730701', () => {
  afterEach(() => {
    jest.restoreAllMocks();
  });
  it('should send error', () => {
    const validationResults = { error: { details: [{ message: 'validation error' }] } };
    const validateSpy = jest.spyOn(Joi, 'validate').mockReturnValueOnce(validationResults);
    const mReq = { params: { extClientId: '123' } };
    const mRes = { status: jest.fn().mockReturnThis(), send: jest.fn() };
    validateExternalId(schemas.idSchema, 'extClientId')(mReq, mRes);
    expect(validateSpy).toBeCalledWith({ param: '123' }, schemas.idSchema);
    expect(mRes.status).toBeCalledWith(400);
    expect(mRes.send).toBeCalledWith('validation error');
  });

  it('should pass the validation and call api', () => {
    const validationResults = { error: undefined };
    const validateSpy = jest.spyOn(Joi, 'validate').mockReturnValueOnce(validationResults);
    const mReq = { params: { extClientId: '123' } };
    const mRes = {};
    const mNext = jest.fn();
    validateExternalId(schemas.idSchema, 'extClientId')(mReq, mRes, mNext);
    expect(validateSpy).toBeCalledWith({ param: '123' }, schemas.idSchema);
    expect(mNext).toBeCalled();
  });
});

Результаты модульного теста со 100% покрытием:

 PASS  stackoverflow/60730701/validator.test.js (9.96s)
  60730701
    ✓ should send error (6ms)
    ✓ should pass the validation and call api (2ms)

--------------|---------|----------|---------|---------|-------------------
File          | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
--------------|---------|----------|---------|---------|-------------------
All files     |     100 |      100 |     100 |     100 |                   
 validator.js |     100 |      100 |     100 |     100 |                   
--------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        11.647s, estimated 15s

исходный код: https://github.com/mrdulin/react-apollo-graphql-starter-kit/tree/master/stackoverflow/60730701

...