如何在整合测试中处理mongodb竞争条件

时间:2016-06-14 13:57:26

标签: mongodb express concurrency

我有一个带有唯一字段的mongoose模式,我正在尝试编写一个后端(快速)集成测试,该测试检查POST同一实体两次导致HTTP 400.当手动测试时,行为也是如此。然而,自动测试需要等待:

it('should not accept two projects with the same name', function(done) {
  var project = // ...
  postProjectExpect201(project,
                       () => {
                         setTimeout( () => {
                           postProjectExpect400(project, done);
                         },100);
                       }
                      );
});

两个post ...方法按指定方式执行,上面的代码工作正常,但如果超时被删除,BOTH请求会收到HTTP 200(尽管在数据库中只创建了一个实体)。

我是这些技术的新手,我不确定发生了什么。这可能是一个与mongodb相关的并发问题,如果是这样,我应该如何处理呢?

数据库调用如下所示:

Project.create(req.body)
.then(respondWithResult(res, 201))
.catch(next);

我已经尝试使用?w = 1选项btw连接到mongodb。

更新

更详细: Project 是一个猫鼬模型, next 是我的快速错误处理程序,用于捕获重复错误。

测试功能:

var postProjectExpect201=function(project, done, validateProject) {
  request(app)
  .post('/api/projects')
  .send(project)
  .expect(201)
  .expect('Content-Type', /json/)
  .end((err, res) => {
    if (err) {
      return done(err);
    }
    validateProject && validateProject(res.body);
    done();
  });
};

var postProjectExpect400=function(project, done) {
  request(app)
  .post('/api/projects')
  .send(project)
  .expect(400)
  .end((err, res) => {
    if (err) {
      return done(err);
    }
    done();
  });
};

0 个答案:

没有答案