如何正确地对 Joi Schemas 进行单元测试验证?

5

我创建了一个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();
  });
});

请对我温柔一点...这是我尝试测试Joi验证器的结果。我尝试了,但我的预期结果现在无法工作,所以我先将其注释掉了。如果有任何指导,将不胜感激。谢谢

1个回答

3

以下是单元测试的解决方案:

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

这是一个源代码的链接,其中包含了关于React、Apollo和GraphQL的起步套件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接