J'ai le middleware suivant :
function check(expectedKeys: string[], req: Request): boolean{ if (expectedKeys.length !== Object.keys(req.body).length) return false; for (const key of expectedKeys) { if (!(key in req.body)) return false; } return true; } export default function checkRequestBodyKeys(expectedKeys: string[]) { return (req: Request, res: Response, next: NextFunction) => { const isValid = check(expectedKeys, req); if (isValid) return next(); return res.status(Status.BadRequest).json({status: Status.BadRequest, error: ErrorMessage.InvalidRequestBody}); } }
Je l'appelle ainsi :
import { Router } from "express"; import postAuth from "../controllers/auth.controller"; import checkRequestBodyKeys from "../middlewares/checkRequestBodyKeys.middleware" export const authRoute = Router(); authRoute.post("/", checkRequestBodyKeys(["email", "password"]), postAuth);
Je veux tester s'il renvoie les valeurs attendues (paramètres de res et next). Je sais comment tester et simuler les fonctions d'un middleware simple, mais pour ce type, je ne sais pas comment l'implémenter.
J'essaie d'écrire du code comme celui-ci mais je sais que cela n'a aucun sens :
describe("validateRequestBody middleware", () => { let mockRequest: Partial<Request>; let mockResponse: Partial<Response>; let nextFunction: NextFunction = jest.fn(); beforeEach(() => { mockRequest = {}; mockResponse = { status: jest.fn().mockReturnThis(), json: jest.fn(), }; }); test('short name should return error', async () => { const expectedResponse = [{error: "Invalid name"}]; mockRequest = { body: { name: "aa", email: "test@yahoo.com", password: "###!!!AAAbbb111222" } } const check = checkRequestBodyKeys( ["name", "email", "password"] ); expect( checkRequestBodyKeys(["name", "email", "password"]) ).toEqual(Function) }); });
Quelqu'un peut-il m'aider à résoudre ce problème ?
checkRequestBodyKeys renvoie une fonction qui est le véritable middleware utilisé par express. La fonction renvoyée doit être exécutée en utilisant req, res et next simulés. Vous pouvez ensuite vérifier si eux, ou les fonctions qu'ils contiennent, ont été appelés avec les arguments que vous attendiez.