我正在尝试测试一个post
请求,该请求接收信息并保存到mysql数据库。
这是路由器。
router.post('/dbInsert',(req,res,next)=>{
user = req.body;
saveUser(user).then((result)=>{
res.send('All info saved');
}).catch((e)=>{
res.send('All info not saved');
});
});
路由器正常工作,因为我试图将数据发布到其中。
所以现在当我尝试运行测试时,它会说错误。这是测试。
describe('POST /dbInsert',()=>{
it('should create a new user',(done)=>{
var fake = {
Owner : "3",
firstname : "bla",
lastname : "wassup",
email:"unvalid@email.com",
password : "akhjashjkdadh",
token : "121212121"
}
request(app)
.post('/dbInsert')
.send(fake)
.expect(200)
.expect((res)=>{
expect(res.body).to.include(fake);
})
.end((err,res)=>{
if(err)
return done(err);
});
});
});
这是错误。
1 failing
1) POST /dbInsert should create a new user:
AssertionError: expected {} to have property 'Owner'
/* Not related to the above question but just curious */
我是新手,也想问一下,如何克隆数据库,就像不在我自己的数据库上测试一样,但是有一个虚假的数据库来测试这个,然后自己被删除。我看着间谍,但不知道那是不是这样做。
答案 0 :(得分:1)
Supertest测试表现不像您想象的那样。这不会对您发送到服务器的内容进行单元测试。这会测试服务器的响应,因此它不会是您发送的对象。
.expect((res)=>{
expect(res.body).to.include(fake);
})
如果您在路线中致电res.send(body)
,您应该能够像这样验证它:
.end((err, res) => {
if (err) return done(err);
expect(res.body).to.have.property("Owner").that.equal("3");
return done();
})
我看到的另一个问题是你没有正确处理错误。在您的情况下,如果发生错误,您将发送200,这意味着您不知道何时失败,这可能是更新验证似乎无法正常工作的原因。
.catch((E)=> { //唯一不同的是消息。 res.send('所有信息未保存'); });
试试这个:
.catch((E)=> { //现在,注意失败将是一个500 res.status(500)。发送(e.message); });
成功时会超时,因为只有在出现错误时才会调用done
。只需删除if
语句。
.end((err,res)=>{
if(err)
return done(err);
});
这应该有效:
.end(done);
整个世邦:
router.post('/dbInsert',(req,res,next)=>{
user = req.body;
saveUser(user).then((result)=>{
res.send(user);
next();
}).catch((e)=>{
res.status(500).send(e.message);
next();
});
});
describe('POST /dbInsert',()=>{
it('should create a new user',(done)=>{
var fake = {
Owner : "3",
firstname : "bla",
lastname : "wassup",
email:"unvalid@email.com",
password : "akhjashjkdadh",
token : "121212121"
}
request(app)
.post('/dbInsert')
.send(fake)
.expect(200)
.end((err, res) => {
if (err) return done(err);
expect(res.body).to.have.property('Owner').that.equal(fake.Owner);
done();
});
});
});
为了测试,我确认这有效:
const request = require('supertest');
const express = require('express');
const bodyParser = require('body-parser');
const expect = require('chai').expect;
const app = express();
app.use(bodyParser.json());
app.post('/user', function(req, res) {
return res.send(req.body);
});
request(app)
.post('/user')
.send({
foo: "bar"
})
.expect(200)
.end(function(err, res) {
if (err) throw err;
expect(res.body.foo).to.equal("bar");
});
如果它仍然无法正常工作,那么肯定会有一些看不见的事情发生。如果查看输出无效,请尝试console.dir(res.body)
。