为什么 supertest/jest 当我在测试中明确插入不同的路径时总是调用相同的端点?我需要设置一些配置吗?
Why does supertest/jest always call the same endpoint when I clearly insert a different path in my test? Is there some config I need to set?
这是我的控制器class:
@Crud({
model: {
type: InferenceFile,
},
query: {
join: {
model: {
eager: true,
},
file: {
eager: true,
},
},
},
params: {
id: {
type: 'uuid',
primary: true,
field: 'id',
},
},
})
@Controller('inference-files')
export class InferenceFilesController {
constructor(private service: InferenceFilesService) {
}
@Get('list/:algorithmId')
async getAllInferenceFiles(
@Param('algorithmId') algorithmId: number,
@Query('name') name: string,
@Query('page') page: number = 0,
@Query('size') limit: number = 1000,
) {
return await this.service.findAllByAlgorithmId(algorithmId, name, {
page,
limit,
});
}
@Get(':id')
async get(@Param('id') id: string) {
const result = await this.service.getFile(id);
result.presignedUrl = await this.service.getPresignedDownloadUrl(result);
result.presignedWordsUrl = await this.service.getPresignedWordsUrl(result);
return result;
}
@Get('status')
async getStatus(@Query('modelId') modelId: number) {
return await this.service.getStatus(modelId);
}
}
这是我测试的一部分class哪里出错了:
it('should return an array of inference file statuses', async () => {
// Act
let modelIdToPass = setUp.model1.id;
const { body } = await supertest
.agent(setUp.app.getHttpServer())
.get(`/inference-files/status?${modelIdToPass}`)
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(200);
// Assert
expect(body).toEqual({
'test-id-2': 'FINISHED',
});
});
it('should return the inference file for the given id', async () => {
// Act
const { body } = await supertest
.agent(setUp.app.getHttpServer())
.get('/inference-files/' + TestConstants.INFERENCEFILE_ID_1)
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(200);
// Assert
expect(body).toEqual({
'test-id-1': 'FINISHED',
});
});
it('should return the inference file for the given algorithm id', async () => {
// Act
const { body } = await supertest
.agent(setUp.app.getHttpServer())
.get('/inference-files/list/' + 9)
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(200);
// Assert
expect(body).toBeDefined();
});
所有这些测试都调用相同的端点:@Get(':id')
但是,当我将其中三个中的两个注释掉时,它成功了。或者更好的是,它调用了剩余的“Get”方法。我一直在寻找一整天的答案,但似乎没有人遇到过同样的问题..
当我查看在线文档时,它没有提及任何关于路由的内容。我也不希望模拟实现(我已经看到了使用 express 进行路由的示例)。但这不是我要找的。我希望测试整个流程,因此它需要调用(全部或大部分)我的方法。我使用单独的数据库进行测试,因此不需要模拟。
在控制器中将 @Get('status')
的端点移到 @Get(':id')
的端点上方。
因为 :id
先出现,所以假设 status
实际上是一个 id 值,因此调用了错误的处理程序。
当请求到达您的服务器时,一次评估所有路由,并选择第一个匹配的路由来处理请求。
这是最近被问到的 and 的副本
这是我的控制器class:
@Crud({
model: {
type: InferenceFile,
},
query: {
join: {
model: {
eager: true,
},
file: {
eager: true,
},
},
},
params: {
id: {
type: 'uuid',
primary: true,
field: 'id',
},
},
})
@Controller('inference-files')
export class InferenceFilesController {
constructor(private service: InferenceFilesService) {
}
@Get('list/:algorithmId')
async getAllInferenceFiles(
@Param('algorithmId') algorithmId: number,
@Query('name') name: string,
@Query('page') page: number = 0,
@Query('size') limit: number = 1000,
) {
return await this.service.findAllByAlgorithmId(algorithmId, name, {
page,
limit,
});
}
@Get(':id')
async get(@Param('id') id: string) {
const result = await this.service.getFile(id);
result.presignedUrl = await this.service.getPresignedDownloadUrl(result);
result.presignedWordsUrl = await this.service.getPresignedWordsUrl(result);
return result;
}
@Get('status')
async getStatus(@Query('modelId') modelId: number) {
return await this.service.getStatus(modelId);
}
}
这是我测试的一部分class哪里出错了:
it('should return an array of inference file statuses', async () => {
// Act
let modelIdToPass = setUp.model1.id;
const { body } = await supertest
.agent(setUp.app.getHttpServer())
.get(`/inference-files/status?${modelIdToPass}`)
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(200);
// Assert
expect(body).toEqual({
'test-id-2': 'FINISHED',
});
});
it('should return the inference file for the given id', async () => {
// Act
const { body } = await supertest
.agent(setUp.app.getHttpServer())
.get('/inference-files/' + TestConstants.INFERENCEFILE_ID_1)
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(200);
// Assert
expect(body).toEqual({
'test-id-1': 'FINISHED',
});
});
it('should return the inference file for the given algorithm id', async () => {
// Act
const { body } = await supertest
.agent(setUp.app.getHttpServer())
.get('/inference-files/list/' + 9)
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(200);
// Assert
expect(body).toBeDefined();
});
所有这些测试都调用相同的端点:@Get(':id') 但是,当我将其中三个中的两个注释掉时,它成功了。或者更好的是,它调用了剩余的“Get”方法。我一直在寻找一整天的答案,但似乎没有人遇到过同样的问题..
当我查看在线文档时,它没有提及任何关于路由的内容。我也不希望模拟实现(我已经看到了使用 express 进行路由的示例)。但这不是我要找的。我希望测试整个流程,因此它需要调用(全部或大部分)我的方法。我使用单独的数据库进行测试,因此不需要模拟。
在控制器中将 @Get('status')
的端点移到 @Get(':id')
的端点上方。
因为 :id
先出现,所以假设 status
实际上是一个 id 值,因此调用了错误的处理程序。
当请求到达您的服务器时,一次评估所有路由,并选择第一个匹配的路由来处理请求。
这是最近被问到的