如何在NestJS的e2e测试中配置中间件

8

在真实的应用中,我们写:

export class AppModule implements NestModule {
  constructor() {}

  configure(consumer: MiddlewareConsumer) {
    consumer.apply(JwtExtractionMiddleware).forRoutes({
      path: 'graphql',
      method: RequestMethod.ALL,
    });
  }
}

在端到端测试中,我会做如下操作:

const module = await Test.createTestingModule({
  imports: [ GraphQLModule.forRoot(e2eGqlConfig) ],
  providers: [ PubUserResolver ],
}).compile();
app = await module.createNestApplication().init();

那么我如何在端到端测试中使用特定的middleware呢?


你弄清楚如何在测试中使用中间件了吗? - user2623505
3个回答

15

也许可以尝试创建一个专门用于 e2e 的 TestModule 类,并将其提供给 createTestingModule

@Module({
  imports: [ GraphQLModule.forRoot(e2eGqlConfig) ],
  providers: [ PubUserResolver ],
})
export class TestModule implements NestModule {
  constructor() {}

  configure(consumer: MiddlewareConsumer) {
    consumer.apply(JwtExtractionMiddleware).forRoutes({
      path: 'graphql',
      method: RequestMethod.ALL,
    });
  }
}

接下来在 e2e 中:

const module = await Test.createTestingModule({
  imports: [TestModule]
}).compile();
app = await module.createNestApplication().init();

我遇到了类似的问题,需要添加全局中间件。在互联网上也没有相关信息,但是我偶然发现了解决方案。也许有人正在寻找它,所以这里是:

要在NestJS中使用e2e全局中间件:

首先创建应用程序,但不要初始化。只编译:

const app = Test
  .createTestingModule({ imports: [AppModule] })
  .compile()
  .createNestApplication();

之后,您可以添加所有全局中间件:

app.enableCors();
app.use(json());
app.use(formDataMiddleware(config));

现在初始化应用程序,就完成了:

await app.init();

尝试了你的解决方案,但是无法连接中间件。你有机会尝试它吗(也是第一个选项)? - user2623505
正如我之前所写的,我正在将所有中间件附加在 createNestApplication()init() 之间进行 e2e 测试,并且它可以工作。 - hidook
@hidook,我尝试了你的解决方案,但中间件似乎没有被应用。 - jidesakin
我也无法让Middleware类正常工作...使用一个功能齐全的中间件可以解决,参见 https://docs.nestjs.com/middleware - Maximilian Friedmann
1
@MaximilianFriedmann 对于类,您可以这样使用: app.use(new SomeMiddleware().use); - Jason
@hidook 你真是救了我的一天!:-) - undefined

4

在app.init()之前添加app.use(new AuthMiddleware().use);

describe('Module E2E', () => {
  const mockedTest = {
    create: jest.fn().mockImplementation((t) => Promise.resolve(t)),
  };

  let app: INestApplication;

  beforeAll(async () => {
    const moduleRef = await Test.createTestingModule({
      imports: [
        ConfigModule.forRoot({
          load: [configuration],
        }),
      ],
      controllers: [TestController],
      providers: [
        TestService, // the service contains a MySQL Model
        {
          provide: getModelToken(Test), // Test is the name of Model
          useValue: mockedTest,
        },
      ],
    }).compile();

    app = moduleRef.createNestApplication();
    app.use(new AuthMiddleware().use); // auth middleware
    await app.init();
  });
});

0
关于使用类中间件的问题,我想补充一下之前的回答。
这个app.use(new AuthMiddleware().use);对我来说不起作用,因为在类中无法找到this
所以,需要使用绑定函数
const middleware = new AuthMiddleware()
app.use(middleware.use.bind(middleware));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接