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

testing using Babel,Bluebird Promises and Mocha runs tests in wrong order

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

请注意数据库(在本例中为 neo4j)returns 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});

因此 returns 此处创建的承诺:

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。 我也在 request 模块上使用 promisify 并且我拒绝了一个自定义错误(我是否正确使用它?在文档中他们抛出错误)。

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

.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'}]});
  });

});