Возможно ли реорганизовать функцию подключения во внешней функции / файле?

#javascript #jestjs

#javascript #jestjs

Вопрос:

Мне очень нравится концепция DRY. Мои тесты e2e в моем приложении NestJS всегда используют одни и те же перехваты beforeAll и afterAll , за исключением изменения одного модуля. Я хотел бы поместить эти перехваты в другую функцию / файл. Но, делая это, я потеряю контекст для app , насколько я пытался.

 describe('AnyModule', () => {
  let app

  beforeAll(async () => {
    const moduleFixture: TestingModule = await Test.createTestingModule({
        imports: [
        AnyModule,
        DatabaseModule,
        GraphQLModule.forRoot({
            typePaths: ['./**/*.graphql']
        })
        ]
    }).compile()

    app = moduleFixture.createNestApplication()
    await app.init()
  })
  afterAll(async () => {
    await app.close()
  })

  test('', () => {
    return request(app.getHttpServer())
  })
})
  

Я думал о чем-то подобном этому:

 const beforeHook = async (app, Module) => {
    const moduleFixture: TestingModule = await Test.createTestingModule({
        imports: [
        Module,
        DatabaseModule,
        GraphQLModule.forRoot({
            typePaths: ['./**/*.graphql']
        })
        ]
    }).compile()

    app = moduleFixture.createNestApplication()
    await app.init()
    return app
}
  

которая вызывается как

 let app
beforeAll(async () => beforeHook(app, AnyModule))
afterAll(async () => await app.close())

test('', () => {
    return request(app.getHttpServer())
})
  

Но это возвращает ошибку TypeError: Cannot read property 'getHttpServer' of undefined

Ответ №1:

Способ, которым вы назначаете moduleFixture.createNestApplication() приложению, находится только в области действия функции. Не снаружи. Смотрите здесь, почему:https://www.javascripttutorial.net/javascript-pass-by-value /

Но вы также уже возвращаете приложение. Так что просто измените

 beforeAll(async () => beforeHook(app, AnyModule))
  

Для

 beforeAll(async () => {
  app = await beforeHook(app, AnyModule)
})
  

и это должно работать нормально.