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

Arc*_*ezo 5 unit-testing node.js supertest jestjs joi

我创建了一个在我的路由中调用的 Joi 验证模式。但是,当我运行代码覆盖率时,该文件没有被覆盖。所以,我正在尝试为其编写一个测试。

验证器.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()
    })
  }
};
Run Code Online (Sandbox Code Playgroud)

验证器.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();
  });
});
Run Code Online (Sandbox Code Playgroud)

请对我放轻松...这是我测试这个 Joi 验证器的尝试。我尝试过,但我的预期不起作用,所以我暂时将其注释掉。任何指示将不胜感激。谢谢

sli*_*wp2 4

这是单元测试解决方案:

\n\n

validator.js:

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

validator.test.js:

\n\n
const { validateExternalId, schemas } = require(\'./validator\');\nconst Joi = require(\'joi\');\n\ndescribe(\'60730701\', () => {\n  afterEach(() => {\n    jest.restoreAllMocks();\n  });\n  it(\'should send error\', () => {\n    const validationResults = { error: { details: [{ message: \'validation error\' }] } };\n    const validateSpy = jest.spyOn(Joi, \'validate\').mockReturnValueOnce(validationResults);\n    const mReq = { params: { extClientId: \'123\' } };\n    const mRes = { status: jest.fn().mockReturnThis(), send: jest.fn() };\n    validateExternalId(schemas.idSchema, \'extClientId\')(mReq, mRes);\n    expect(validateSpy).toBeCalledWith({ param: \'123\' }, schemas.idSchema);\n    expect(mRes.status).toBeCalledWith(400);\n    expect(mRes.send).toBeCalledWith(\'validation error\');\n  });\n\n  it(\'should pass the validation and call api\', () => {\n    const validationResults = { error: undefined };\n    const validateSpy = jest.spyOn(Joi, \'validate\').mockReturnValueOnce(validationResults);\n    const mReq = { params: { extClientId: \'123\' } };\n    const mRes = {};\n    const mNext = jest.fn();\n    validateExternalId(schemas.idSchema, \'extClientId\')(mReq, mRes, mNext);\n    expect(validateSpy).toBeCalledWith({ param: \'123\' }, schemas.idSchema);\n    expect(mNext).toBeCalled();\n  });\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

100%覆盖率的单元测试结果:

\n\n
 PASS  stackoverflow/60730701/validator.test.js (9.96s)\n  60730701\n    \xe2\x9c\x93 should send error (6ms)\n    \xe2\x9c\x93 should pass the validation and call api (2ms)\n\n--------------|---------|----------|---------|---------|-------------------\nFile          | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s \n--------------|---------|----------|---------|---------|-------------------\nAll files     |     100 |      100 |     100 |     100 |                   \n validator.js |     100 |      100 |     100 |     100 |                   \n--------------|---------|----------|---------|---------|-------------------\nTest Suites: 1 passed, 1 total\nTests:       2 passed, 2 total\nSnapshots:   0 total\nTime:        11.647s, estimated 15s\n
Run Code Online (Sandbox Code Playgroud)\n\n

源代码:https://github.com/mrdulin/react-apollo-graphql-starter-kit/tree/master/stackoverflow/60730701

\n