1

各位开发者您好,

我编写了一个基于 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,所有测试用例都按预期工作。

4

0 回答 0