【发布时间】:2021-02-03 03:05:40
【问题描述】:
我正在使用 NestJs 和 mysql 创建一个 API。 我用于创建新实体的控制器功能运行良好,但是,我无法测试响应为 400 错误的用例。
这是控制器功能:
@Controller('pubs')
export class PubsController {
constructor(private readonly pubsService: PubsService) {}
@Post()
async create(@Body() createPubDto: CreatePubDto, @Res() res: Response): Promise<void> {
this.pubsService.create(createPubDto)
.then(() => res.status(201).json())
.catch(err => res.status(401).json({ err }));
}
}
这是测试文件:
describe('PubsController', () => {
let controller: PubsController;
let service: PubsService;
const mockResponse = () => {
const res: any = {};
res.status = jest.fn().mockReturnValue(res);
res.json = jest.fn().mockReturnValue(res);
return res;
};
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [PubsController],
providers: [PubsService, {
provide: getRepositoryToken(Pub),
useValue: {},
}],
}).compile();
controller = module.get<PubsController>(PubsController);
service = module.get<PubsService>(PubsService);
});
afterEach(() => {
jest.resetAllMocks();
jest.clearAllMocks();
});
describe('create success', () => {
const res = mockResponse();
it('Should create a pub', async () => {
const req = mockedPub;
jest.spyOn(service, 'create').mockResolvedValue(mockedPub);
await controller.create(req, res);
expect(res.status).toHaveBeenCalledWith(201);
});
it('Should return 400 if the body is not correct', async () => {
const req: any = {};
jest.spyOn(service, 'create').mockResolvedValue(req);
await controller.create(req, res);
expect(res.status).toHaveBeenCalledWith(400);
});
})
});
“应该创建一个酒吧”运行良好,但是当我给创建函数一个空对象时,测试给我一个 201 res.status。
expect(jest.fn()).toHaveBeenCalledWith(...expected)
Expected: 400
Received: 201
有人知道为什么吗?
【问题讨论】: