#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)
})
и это должно работать нормально.