当前位置: 首页 > 知识库问答 >
问题:

异常csrfToken在被超级测试调用时不是函数

江睿
2023-03-14

我有一个带有CSRF保护的NestJS后端和一个获取CSRF令牌的endpoint。在使用jest和supertest测试此endpoint时,我得到typeerror:req.csrftoken不是函数

我的代码是这样的:

// main.ts
async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  app.use(cookieParser());
  app.use(csurf({ cookie: true }));

  await app.listen(process.env.BACKEND_SERVER_PORT);
}

// authController.ts
import { Controller, Req, Get } from "@nestjs/common";
import { Request } from "express";
import * as AuthDto from "./modules/auth/dto/auth.dto";

@Controller("auth")
export class AppController {
  constructor() {}

  @Get("csrf")
  async getCsrfToken(@Req() req: Request): Promise<AuthDto.CsrfOutput> {
    return { csrfToken: req.csrfToken() };  // <-- ERROR HAPPENS HERE
  }
}

// app.controller.spec.ts
import { Test, TestingModule } from "@nestjs/testing";
import { INestApplication } from "@nestjs/common";
import request from "supertest";
import AppModule from "../src/app.module";

describe("AppController (e2e)", () => {
  let app: INestApplication;
  let server: any;

  beforeAll(async () => {
    const moduleFixture: TestingModule = await Test.createTestingModule({
      imports: [AppModule],
    }).compile();

    app = moduleFixture.createNestApplication();
    await app.init();
    server = app.getHttpServer();
  });

  it("/csrf (GET)", () => {
    return request(server).get("/auth/csrf").expect(200).expect("hello");
    // I'll add more validations here once I get past this error
  });
});

我相信这可能与测试本身有关,因为当外部客户端(我们的前端应用程序或邮递员)调用该endpoint时,该endpoint可以正常工作。它对超级测试不起作用。

有人知道为什么吗?多谢了。

共有1个答案

严高峻
2023-03-14

您只在main.ts中注册csurf,但是您的测试直接使用AppModule。AppModule不会自己注册csurf。因此,当测试创建您的AppModule时,它没有必要的中间件。

 类似资料:
  • 问题内容: 在我的节点应用程序中,我正在使用mocha测试我的代码。使用mocha调用许多异步函数时,出现超时错误()。我该如何解决? 问题答案: 您可以在运行测试时设置超时: 或者,您可以通过编程为每个套件或每个测试设置超时: 有关更多信息,请参阅文档。

  • 我正在测试路由器,有两个函数,我需要测试第一个函数是否被调用,第二个函数是否被调用。有方法

  • 问题内容: 我有一个类A,并写了一个子类B。A只有一个参数化的构造函数。B必须调用A的这个超级构造函数。现在,我想使用一个Object作为参数。该对象应调用B的方法。因此,参数对象必须持有B的引用,或者必须是内部类。 现在,当我想调用构造函数时,……Eclipse说: 在显式调用构造函数时无法引用“ this”或“ super” 我唯一想解决的是设置方法,将“ this”实例注入到参数对象中。我不

  • 我试图在运行在Android中的SubscriptionClient实例上调用RegisterMessageHandler方法。 在将消息发布到特定主题(通过自动测试)20秒左右之后,我在我的Android应用程序中收到了几个超时异常,该应用程序实际上包含了SubscriptionClient实例的RegisterMessageHandler。 输出窗口 这里有个错误: **System.Time

  • 我的任务是为另一个团队编写的AngularJS代码编写单元测试,该团队没有编写任何测试 他们已经编写了以下函数,但我不知道如何测试它 我需要测试每个函数是否被调用,而不是担心它们做什么,因为我将分别测试它们,只是它们被调用。 调用populateCallAlertOnEditCall时,需要返回空数组或其中包含某些项的数组 调用openAlertModalInstance时,它需要返回未定义的或传