超测无法测试重复的 post 请求
Supertest fails to test repeated post request
我正在测试创建用户的 api。 api 不允许创建具有相同登录值的用户。所以我写了下面的测试:
const app = require('../config/express'); //exports a configured express app
const request = require('supertest');
const {populateUsers} = require('../seeders/users.seed');
beforeEach(populateUsers);//drop and populate database with some seeders
describe('POST /v1/users', () => {
it('#Post a new user - 201 status code', (done) => {
request(app)
.post('/v1/users')
.send({
login:'user-teste-01',
password: 'pass01'
}).expect(201, done);
});
it('#Post repeated login - 400 status code', (done) => {
request(app)
.post('/v1/users')
.send({
login:'user-teste-01',
password: 'pass01'
}).expect(400, done);
});
});
第一次测试有效,但第二次测试returns出现以下错误:
Error: expected 400 "Bad Request", got 201 "Created"
我手动进行了测试,api 工作正常(返回 400 状态代码)。
这次测试我哪里出错了?
所以看起来你的 beforeEach 在每个单独的测试之前被调用。因此,在您添加第一个用户后,您的 table 变为 reset/reseeded。也许尝试将您的填充用户放在 before() 中,这样它只会发生一次。我不是 100% 确定,但如果这对你有用,请告诉我。
例如,如果您完全删除了 beforeEach(),如果这没有达到您的期望,我会感到非常惊讶。
这是因为您 beforeEach
重置了您的数据库。此挂钩将在每个测试中执行,因此在您的 400 status code
中,您不再拥有用户 user-teste-01
,因为它已被 beforeEach
重置。
有一些解决方案:
#1 使用种子中已有的登录名和密码
it('#Post repeated login - 400 status code', (done) => {
request(app)
.post('/v1/users')
.send({
login: 'user-exist-in-seed',
password: 'pass01'
}).expect(400, done);
});
#2 运行在场景
之前再次创建用户
context('when user is already exist', function() {
beforeEach(function() {
// create a user `user-teste-01`
// use beforeEach so it will be executed after seeding
})
it('#Post repeated login - 400 status code', (done) => {
request(app)
.post('/v1/users')
.send({
login: 'user-teste-01',
password: 'pass01'
}).expect(400, done);
});
});
3 使用 before 而不是 beforeEach 来播种
它会在所有测试前运行一次
before(populateUsers);//drop and populate database with some seeders
我正在测试创建用户的 api。 api 不允许创建具有相同登录值的用户。所以我写了下面的测试:
const app = require('../config/express'); //exports a configured express app
const request = require('supertest');
const {populateUsers} = require('../seeders/users.seed');
beforeEach(populateUsers);//drop and populate database with some seeders
describe('POST /v1/users', () => {
it('#Post a new user - 201 status code', (done) => {
request(app)
.post('/v1/users')
.send({
login:'user-teste-01',
password: 'pass01'
}).expect(201, done);
});
it('#Post repeated login - 400 status code', (done) => {
request(app)
.post('/v1/users')
.send({
login:'user-teste-01',
password: 'pass01'
}).expect(400, done);
});
});
第一次测试有效,但第二次测试returns出现以下错误:
Error: expected 400 "Bad Request", got 201 "Created"
我手动进行了测试,api 工作正常(返回 400 状态代码)。
这次测试我哪里出错了?
所以看起来你的 beforeEach 在每个单独的测试之前被调用。因此,在您添加第一个用户后,您的 table 变为 reset/reseeded。也许尝试将您的填充用户放在 before() 中,这样它只会发生一次。我不是 100% 确定,但如果这对你有用,请告诉我。
例如,如果您完全删除了 beforeEach(),如果这没有达到您的期望,我会感到非常惊讶。
这是因为您 beforeEach
重置了您的数据库。此挂钩将在每个测试中执行,因此在您的 400 status code
中,您不再拥有用户 user-teste-01
,因为它已被 beforeEach
重置。
有一些解决方案:
#1 使用种子中已有的登录名和密码
it('#Post repeated login - 400 status code', (done) => {
request(app)
.post('/v1/users')
.send({
login: 'user-exist-in-seed',
password: 'pass01'
}).expect(400, done);
});
#2 运行在场景
之前再次创建用户context('when user is already exist', function() {
beforeEach(function() {
// create a user `user-teste-01`
// use beforeEach so it will be executed after seeding
})
it('#Post repeated login - 400 status code', (done) => {
request(app)
.post('/v1/users')
.send({
login: 'user-teste-01',
password: 'pass01'
}).expect(400, done);
});
});
3 使用 before 而不是 beforeEach 来播种
它会在所有测试前运行一次
before(populateUsers);//drop and populate database with some seeders