typescript 在我的中间件测试中可能出现什么问题(jest)?

lb3vh1jj  于 2023-03-24  发布在  TypeScript
关注(0)|答案(1)|浏览(114)

这是我要测试的中间件函数:

export default function validateReqBodyMiddleware(req: Request, res: Response, next: NextFunction) {
  const { name, email }: RequestBody = req.body;
  let errors: iError[] = [];

  if (!validator.isEmail(email.trim())) errors.push({error: "invalid email", invalidField: "email"});
  if (validator.isEmpty(name.trim())) errors.push({error: "empty name", invalidField: "name"});
  
  if (errors.length) return res.status(Status.BadRequest).json(errors);
  next();
}

测试编写如下:

import validateRequestBody from "../../middlewares/validateRequestBody.middleware";
import { Request, Response, NextFunction } from "express";

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

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

  test("wrong email format", async () => {
    const expectedResponse = [{ error: "invalid email", invalidField: "email" }];

    mockRequest = {
      body: {
        name: "John Doe",
        email: "test"
      }
    }

    validateRequestBody(
      mockRequest as Request,
      mockResponse as Response,
      nextFunction
    );

    expect(mockResponse.status).toBeCalledWith(400);
    expect(mockResponse.json).toBeCalledWith(expectedResponse);
  });
});

试验结果:

FAIL  src/tests/unitTests/test_validateRequestBody.middleware.test.ts
  validateRequestBody middleware
    ✕ wrong email format (2 ms)

  ● validateRequestBody middleware › wrong email format

    TypeError: Cannot read properties of undefined (reading 'json')

      23 |   if (validator.isEmpty(name.trim())) errors.push({error: "empty name", invalidField: "name"});
      24 |   
    > 25 |   if (errors.length) return res.status(Status.BadRequest).json(errors);
         |                                                          ^
      26 |   next();
      27 | }

      at validateRequestBody (src/middlewares/validateRequestBody.middleware.ts:25:58)
      at Object.<anonymous> (src/tests/unitTests/test_validateRequestBody.middleware.test.ts:27:24)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        1.216 s, estimated 2 s
Ran all test suites.

我认为发生这种情况是因为方法.status()和.json()是串联的.当我删除一个或另一个测试通过.我不知道以何种方式我可以解决这个问题.有人可以帮助我解决这个问题吗?

mfpqipee

mfpqipee1#

您在以下位置有一个method chaining

if (errors.length) return res.status(400).json(errors);

你的mock有:

mockResponse = {
  status: jest.fn(),
  json: jest.fn(),
};

你要做的是:

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

因此.status()可以返回.json()

相关问题