Ste*_*ott 5 automated-tests jestjs nestjs
我有一个简单的类,我试图使用 NestJS 和端到端测试来确保我可以使验证正常工作,但我无法使验证工作。如果我使用 Postman 或普通客户端发送数据,应用程序确实会响应正确的错误。
API.dto.ts
import { IsNumber, IsPositive, IsString } from 'class-validator';
export class ApiDTO {
@IsString() public readonly FileName:string;
@IsNumber() @IsPositive() public readonly StatusCode:number;
@IsNumber() @IsPositive() public readonly TimeOut:number;
}
Run Code Online (Sandbox Code Playgroud)
端到端测试文件
import { Test, TestingModule } from '@nestjs/testing';
import * as request from 'supertest';
import { INestApplication, ValidationPipe } from '@nestjs/common';
import { AppModule } from '@APP/app.module';
import { ApiDTO } from './../../src/api/api.dto';
describe('ApiController (e2e)', () => {
let app: INestApplication;
beforeEach(async () => {
const moduleFixture: TestingModule = await Test.createTestingModule({
imports: [AppModule],
}).compile();
app = moduleFixture.createNestApplication();
app.useGlobalPipes(new ValidationPipe());
await app.init();
});
it('/api/test/ (POST) test to see data validation works', async done => {
const RequestBody:ApiDTO = {
FileName : 'README.md',
StatusCode: 111,
TimeOut: -25
};
const Expected:string = `${RequestBody.FileName} = ${RequestBody.StatusCode.toString()} after ${RequestBody.TimeOut.toString()}`;
const ResponseData = await request(app.getHttpServer())
.post('/api/test')
.send(RequestBody)
.set('Accept', 'application/json');
// All of these will fail as the code returns a 200 OK, as it does not do the validation (TimeOut -25 should fail IsPositive())
expect(ResponseData.status).toBe(400);
expect(ResponseData.headers['content-type']).toContain('application/json');
// This line caused the problem as body is an object
//expect(ResponseData.body.length).toBeGreaterThan(2);
expect(ResponseData.body.statusCode).toBe(400);
expect(ResponseData.body.message[0]).toBe('TimeOut must be a positive number');
expect(ResponseData.body.error).toBe('Bad Request');
done();
});
});
Run Code Online (Sandbox Code Playgroud)
当我拨打这个电话时,我得到了成功的回报,200。我的代码应该失败,因为 TimeOut 为负数,而它需要的位置IsPositive()
。服务和其他代码都运行,只是验证不运行。我已在 beforeEach() 中添加了全局管道,因此不确定还要检查什么。
Ste*_*ott 10
我在测试中发现了错误。将 ValidationPipe() 添加到应用程序定义中后:
app = moduleFixture.createNestApplication();
app.useGlobalPipes(new ValidationPipe()); // <- This addition
await app.init();
Run Code Online (Sandbox Code Playgroud)
这使得验证能够正常运行。测试失败了,因为我正在检查响应正文的长度,
it('/api/test/ (POST) test to see data validation works', async done => {
...
expect(ResponseData.body.length).toBeGreaterThan(10);
...
done();
});
Run Code Online (Sandbox Code Playgroud)
ResponseData.body 是一个对象,因此该.length
对象的 是无效的。消除这种期望解决了我的问题。
it('/api/test/ (POST) test to see data validation works', async done => {
const RequestBody:ApiDTO = {
FileName : 'README.md',
StatusCode: 111,
TimeOut: -25
};
const Expected:string = `${RequestBody.FileName} = ${RequestBody.StatusCode.toString()} after ${RequestBody.TimeOut.toString()}`;
const ResponseData = await request(app.getHttpServer())
.post('/api/test')
.send(RequestBody)
.set('Accept', 'application/json');
expect(ResponseData.status).toBe(400);
expect(ResponseData.headers['content-type']).toContain('application/json');
expect(ResponseData.body.statusCode).toBe(400);
expect(ResponseData.body.message[0]).toBe('TimeOut must be a positive number');
expect(ResponseData.body.error).toBe('Bad Request');
done();
});
Run Code Online (Sandbox Code Playgroud)