NestJS测试错误:无法在E2E测试mocha中找到编译的js文件



我在运行端到端测试时遇到了问题。这是由nestcli生成的默认端到端测试文件结构。

import { Test, TestingModule } from '@nestjs/testing';
import { INestApplication } from '@nestjs/common';
import * as request from 'supertest';
import { AppModule } from './../src/app.module';
describe('AppController (e2e)', () => {
let app: INestApplication;
beforeEach(async () => {
const moduleFixture: TestingModule = await Test.createTestingModule({
imports: [AppModule],
}).compile();
app = moduleFixture.createNestApplication();
await app.init();
});
it('/ (GET)', () => {
return request(app.getHttpServer())
.get('/')
.expect(200)
.expect('test');
});
});

我正在使用我的软件包mocha运行测试。Json测试脚本命令为:

"test": "mocha --exit --require ts-node/register test/**/*.spec.ts test/*.spec.ts"

我看到的错误是:

1) AppController (e2e)
"before each" hook for "/ (GET)":
Error: File <root_path>/src/queuemanager/status.processor.js does not exist
at Queue.setHandler (node_modules/bull/lib/queue.js:641:13)
at Queue.process (node_modules/bull/lib/queue.js:610:8)
at option.processors.forEach (node_modules/@nestjs/bull/dist/bull.providers.js:27:27)
at Array.forEach (<anonymous>)
at buildQueue (node_modules/@nestjs/bull/dist/bull.providers.js:12:27)
at InstanceWrapper.useFactory [as metatype] (node_modules/@nestjs/bull/dist/bull.providers.js:57:20)
at Injector.instantiateClass (node_modules/@nestjs/core/injector/injector.js:289:55)
at callback (node_modules/@nestjs/core/injector/injector.js:42:41)

我的项目在src中的目录结构是:

$ tree -L 2
.
├── app.controller.ts
├── app.module.ts
├── app.service.ts
├── main.ts
└── queuemanager
├── queuemanager.controller.ts
├── queuemanager.module.ts
└── status.processor.ts

这与https://github.com/nestjs/nest/tree/master/sample/26-queues中提供的示例非常相似。基本上,我正在创建一个队列,使用status.processor.ts在一个单独的进程中处理任务。这是我的queuemanager模块的样子:

import { Module } from '@nestjs/common';
import { BullModule } from '@nestjs/bull';
import { QueuemanagerController } from './queuemanager.controller';
import { join } from 'path';
@Module({
imports: [
BullModule.registerQueue({
name: 'status',
processors: [{
name: 'statusProcessing',
path: join(__dirname, 'status.processor.js')
}]
}),
],
controllers: [QueuemanagerController],
})
export class QueuemanagerModule {}

为了使事情正常工作,我需要提供js文件的编译路径。然而,我假设测试由于某种原因无法正确地找到这个-也许它没有正确编译。希望能得到一些帮助。由于

我不知道这是不是正确的答案,但我是这样做的:

import { Module } from '@nestjs/common';
import { BullModule } from '@nestjs/bull';
import { QueuemanagerController } from './queuemanager.controller';
import { join } from 'path';
const filename: string = process.env.NODE_ENV === 'test' ? 'status.processor.ts' : 'status.processor.js';
@Module({
imports: [
BullModule.registerQueue({
name: 'status',
processors: [{
name: 'statusProcessing',
path: join(__dirname, filename)
}]
}),
],
controllers: [QueuemanagerController],
})
export class QueuemanagerModule {}

并在运行测试的npm脚本中设置NODE_ENV=test。如果有人知道更好的方法,请随时更新。

最新更新