Nest.js Fastify 测试 TypeError: app.address is not a function

Posted

技术标签:

【中文标题】Nest.js Fastify 测试 TypeError: app.address is not a function【英文标题】:Nest.js Fastify testing TypeError: app.address is not a function 【发布时间】:2019-03-22 04:43:14 【问题描述】:

使用 FastifyAdapterNest.js 中执行 e2e 测试时,我在执行测试时收到以下错误:

TypeError: app.address is not a function

  54 | 
  55 |     return request(app.getHttpServer())
> 56 |       .post('/authentication/register')
     |        ^
  57 |       .send(payload)
  58 |       .expect(400);
  59 |   );

组成如下:

   beforeAll(async () => 
    const module = await Test.createTestingModule(
      imports: [AuthenticationModule],
    )
      .overrideProvider(UserRepository)
      .useValue(userRepository)
      .compile();

    app = module.createNestApplication(new FastifyAdapter());
    await app.init();
  );

  it(`/POST register - should succeed for valid info`, () => 
    const payload =  email: 'johnson@gmail.com', password: '1234' ;

    return request(app.getHttpServer())
      .post('/authentication/register')
      .send(payload)
      .expect()
      .expect(201);
  );

不使用 FastifyAdapter 时不会出现此类错误。使用适配器的原因是 fastify-cookie 插件可以通过请求实现 cookie 操作。

请注意,在此演示中,我在 beforeAll 中没有使用 cookie 插件,这本来是:

const fastifyAdapter = new FastifyAdapter();
fastifyAdapter.register(fastifyCookie);

【问题讨论】:

【参考方案1】:

我错过了有关 Fastify 的 Nest.js 测试的文档,该文档可以在 Nest.js 的源代码中找到,但在站点文档中没有。在使用 fastify 时,我们需要使用 IT 文档中的测试方法。以下示例工作正常:

beforeAll(async () => 
    const fastifyAdapter = new FastifyAdapter();
    fastifyAdapter.register(fastifyCookie);

    const module = await Test.createTestingModule(
      imports: [AuthenticationModule],
    )
      .overrideProvider(UserRepository)
      .useValue(userRepository)
      .compile();

    app = module.createNestApplication(fastifyAdapter);
    await app.init();
);

it(`/POST register - should succeed for valid info`, () => 
    return app
      .inject(
        method:  'POST',
        url:     '/authentication/register',
        payload:  email: 'johnson@gmail.com', password: '1234' ,
      )
      .then(( statusCode, payload ) => 
        expect(payload).toEqual('');
        expect(statusCode).toEqual(201);
      );
);

afterAll(async () => 
    await app.close();
);

【讨论】:

以上是关于Nest.js Fastify 测试 TypeError: app.address is not a function的主要内容,如果未能解决你的问题,请参考以下文章

Nest js 是不是以 express js 为核心实现了几乎两倍的基准测试结果。?或者只是为了实现它

带有 NEST.JS 的 newrelic/apollo-server-plugin

如何在单元测试 Nest.js 中测试抛出新的 HttpException

Nest.js 在单元测试中无法解析 Mongoose 模型依赖

单元测试 Nest JS 过滤器捕获方法

如何使用 nestjs-graphql-fastify 服务器上传文件以及如何测试此类功能?