Express 快速测试

Express 快速测试,express,jestjs,nestjs,Express,Jestjs,Nestjs,我有一个简单的汽车买卖API的控制器,它可以做到这一点 async processCarSale(@Res() res: any) { if(carSaleService.sale()) { return res.status(201).send(<some-body>); } return res.status(204).send(<some-other-body>); } 然而,这似乎并没有实际测试状态代码 有没有办法测试通过

我有一个简单的汽车买卖API的控制器,它可以做到这一点

async processCarSale(@Res() res: any) {
    if(carSaleService.sale()) {
        return res.status(201).send(<some-body>);
    }
    return res.status(204).send(<some-other-body>);
}
然而,这似乎并没有实际测试状态代码


有没有办法测试通过Express在响应中发送的状态码?

您可以使用()

您可以使用还提供的HttpStatus枚举,它提供所有HTTP代码状态

test('/route (POST)', () => {
  const data = { any: 'data', what: 'you want' }
  request(app.getHttpServer())
            .post('/route')
            .send(data)
            .expect(HttpStatus.CREATED)
            .expect('Content-Type', /json/)
}

您的mock从来没有设置一个名为
statusCode
的值,它只是存根函数并返回相同的对象,以便也可以调用
send()
(也是存根)。如果您希望能够测试类似于
res.statusCode===200
的内容,您可以执行以下操作:

const mockResponse={
状态:jest.fn(),
send:jest.fn(),
状态代码:0
}
const mockResponseSent={send:jest.fn()};
mockResponse.status=jest.fn(()=>{
mockResponseSent.statusCode=200;
返回mockresent;
});
等待carController.processCarSale(响应);
expect(response.statusCode).toBe(200);
然而,这本质上是重新编写控制器的逻辑,这不是很好。因此,更好的方法是利用Jest的
mockImplementation()
方法,您可以在其中执行以下操作

const mockResponse={
状态:jest.fn(),
发送:jest.fn()
}
const mockResponseSent={send:jest.fn()};
mockResponse.status=jest.fn().mockImplementation((状态)=>{
mockResponseSent.statusCode=状态;
返回mockresent;
});
等待carController.processCarSale(响应);
expect(response.statusCode).toBe(200);

不过,总的来说,我建议放弃在控制器中使用
res
,并建议让Nest处理http状态码的设置并发送响应。您可以使用
@HttpCode()

将代码设置为默认值以外的值,谢谢您的回复;然而,对于SuperTest,它并不是真正的单元测试anymore@RaySaudlach控制器不匹配(Bisnise逻辑),而且它们很难模拟。测试控制器时,应切换到集成测试,而不是单元测试。保存对服务和实用程序的模拟
test('/route (POST)', () => {
  const data = { any: 'data', what: 'you want' }
  request(app.getHttpServer())
            .post('/route')
            .send(data)
            .expect(HttpStatus.CREATED)
            .expect('Content-Type', /json/)
}