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 验证器的尝试。我尝试过,但我的预期不起作用,所以我暂时将其注释掉。任何指示将不胜感激。谢谢
这是单元测试解决方案:
\n\nvalidator.js:
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};\nRun Code Online (Sandbox Code Playgroud)\n\nvalidator.test.js:
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});\nRun Code Online (Sandbox Code Playgroud)\n\n100%覆盖率的单元测试结果:
\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\nRun Code Online (Sandbox Code Playgroud)\n\n源代码:https://github.com/mrdulin/react-apollo-graphql-starter-kit/tree/master/stackoverflow/60730701
\n