使用Babel,Bluebird Promises和Mocha进行测试以错误的顺序运行测试

时间:2015-08-11 16:30:03

标签: javascript node.js mocha bluebird es6-promise

我有点困惑,我也是承诺的新手。 我的问题是beforeEach函数以随机顺序运行(这怎么可能?)这样就不会先运行删除查询。如果我在promise(??)中放入console.log消息,订单也会改变。我在这里做错了什么。

请注意,数据库(在这种情况下为neo4j)返回200 OK,以防出现约束违规,这就是我读取结果然后拒绝的原因。

我有这个测试(使用chai-as-promised):

    beforeEach(function() {

    return neodb.query('MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r',{}) //clear the db first
        .then(neodb.query(query,{props:[{username:'arisAlexis'}]}))
        .then(neodb.query(query,{props:[{username:'marySilva'}]}))
        .then(neodb.query(query,{props:[{username:'silviaBurakof'}]}));

});

it('create a username conflict',function() {
    return User.create([{username:'arisAlexis'}]).should.be.rejected;
})

User.create是一个静态方法,只运行它:

return db.query(query,{props:props});

所以它返回一个在这里创建的承诺:

exports.query=function(query,params) {

return new Promise(function(resolve,reject) {
    request.postAsync({
        uri: dbUrl,
        json: {statements: [{statement: query, parameters: params}]}
    }).then(function(result) {
        if (result[1].errors.length > 0) {
            reject(new NeoError(result[1].errors[0].message,result[1].errors[0].code));
        }
        resolve(result[1].results);

    });
});}

我正在使用babel-node运行mocha。 我也在请求模块上使用promisify,我拒绝了自定义错误(我是否正确使用它?在文档中他们抛出错误)。

1 个答案:

答案 0 :(得分:1)

您正在同时执行所有查询功能,而不是等待前一个查询功能结束:

.then(neodb.query(...)) // this executes `neodb.query()` right away
                        // and uses its return value as the callback
                        // function for the `.then()`.

以下是解决这个问题的方法:

beforeEach(function() {

  return neodb.query('MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r',{}).then(function() {
    return neodb.query(query,{props:[{username:'arisAlexis'}]});
  }).then(function() {
    return neodb.query(query,{props:[{username:'marySilva'}]});
  }).then(function() {
    return neodb.query(query,{props:[{username:'silviaBurakof'}]});
  });

});