各位开发者您好,
我编写了一个基于 node.js 和 mongoose 的 RESTful API 服务器。在编写相应的测试时,我对使用 chai-http 的自动化测试和使用 ARC(高级 REST 客户端,chrome 插件)的手动 API 测试之间的行为有着显着不同的奇怪体验。
我的用户模型(见下面的定义)有一个唯一的“用户名”字段。当我使用 ARC 使用现有用户名 /POST 一个新用户时,我从 mongodb 驱动程序中得到了一个 E11000,正如预期的那样。
当我使用 chai-http.request.post 做同样的事情时(至少我是这么认为的),我得到一个状态码 200,一个成功的结果,我的测试数据库集合中有两个用户名相同!
用户模型模式,包括/挂钩/导出等。省略:
const userSchema = new Schema({
admin_info: AdminInfo,
role: { type: String, required: true},
username: { type: String, required: true, unique: true, index: { unique: true } },
password: { type: String, required: true },
firstname: String,
lastname: String,
mail: String,
});
POST /users 的通用路由处理函数,其中“model”是上述用户模式的一个实例:
function addEntry(req, res, next, model) {
var entry = new model(req.body);
entry.save((err, obj) => {
if(err) {
res.status(500).json({'ERROR': err});
} else {
res.json({'SUCCESS': obj});
}
});
}
chai 测试用例产生状态码 200 和 SUCCESSful 插入(不符合预期!):
describe('Users API', () => {
beforeEach((done) => {
var user = createUser();
user.save((err) => {
if (err) {
console.error(err);
}
done();
})
});
afterEach((done) => {
User.collection.drop();
done();
});
...
it('should NOT add a SINGLE user if the username already exists on /users POST' , (done) => {
var user = new User({
admin_info: {
author: 'NEC'
},
role: 'mod',
username: 'Lycidas',
password: 'abcd'
});
chai.request(server)
.post('/users')
.send(user)
.end((err, res) => {
console.log(res.body);
res.should.have.status(500);
res.should.be.json;
res.body.should.be.a('object');
res.body.should.have.property('ERROR');
done();
});
});
在 POST 请求之后,带有 GET /users 的相同 chai 测试用例日志输出:
[
{
"_id": 689,
"role": "admin",
"username": "Lycidas",
"password": "$2a$10$RmDbg4rvtP147i6Rt2C9.Okx1pZ96cIWUoNW/TxzrD4UbZIHvJRw.",
"__v": 0,
"admin_info": {
"modified_at": "2017-08-07T08:42:10.355Z",
"author": "NEC",
"created_at": "2017-08-07T08:42:10.355Z"
}
},
{
"_id": 690,
"role": "mod",
"username": "Lycidas",
"password": "$2a$10$O1yrYmO42lLyW8nOyqlnauJSGJB/3MLp0mHrDISWMh1AgNAViuzB.",
"__v": 0,
"admin_info": {
"modified_at": "2017-08-07T08:42:10.453Z",
"author": "NEC",
"created_at": "2017-08-07T08:42:10.448Z"
}
}
]
如您所见,第二个用户有一个现有的用户名,但添加时没有错误。有任何想法吗?我的测试用例是否错误,我的 API 是否应该正常工作?或者我是否在我的服务器中创建了一个潜在危险的错误?我对 PUT /users/ 也有相同(不同)的行为。
任何帮助将不胜感激,
狼蛛
/编辑:出于好奇,我使用了 NPM 包“mongoose-unique-validator”,并且,tada,所有测试用例都按预期工作。