Comment tester un middleware qui accepte des paramètres ?
P粉548512637
P粉548512637 2023-09-07 18:39:45
0
1
622

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 ?

P粉548512637
P粉548512637

répondre à tous(1)
P粉745412116

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.

describe("validateRequestBody middleware", () => {
  let mockRequest: Partial;
  let mockResponse: Partial;
  let nextFunction: NextFunction = jest.fn();

  beforeEach(() => {
    mockRequest = {};
    mockResponse = {
      status: jest.fn().mockReturnThis(),
      json: jest.fn(),
    };
  });

  test('short name should return error', async () => {
    const expectedResponse = {status: 400, error: "Invalid name"};
    mockRequest = {
      body: {
        name: "aa",
        email: "test@yahoo.com",
        password: "###!!!AAAbbb111222"
      }
    }

    const check = checkRequestBodyKeys(
      ["name", "email", "password"]
    );

    expect( check ).toEqual( expect.any(Function) )

    // The middleware is called
    check(mockRequest, mockResponse, nextFunction)
    // And here you check if the res.json function was called with certain parameters
    expect( mockResponse.json ).toBeCalledWith(expectedResponse)
  });
});
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal