嵌套承诺 - 摩卡 - 超时超时

时间:2016-04-29 09:40:21

标签: javascript node.js promise mocha

由于使用Mocha超时,我的测试失败了。 我确实称之为“done()”函数,但由于某种原因它似乎不起作用。

我的测试目前看起来像这样:

var express = require('express');
var expect = require('chai').expect;
var mocha = require('mocha');
var calendar = require('./../Server/calendarDatabase');

describe("Calendar", function () {
    describe("Database", function () {
        it("should get stuff from the database", function (done) {
            return calendar.Connect()
            .then(function () {
                return calendar.getAll();
            })
            .then(function (returnValue) {
                expect(returnValue.count).to.equal(5); //This should fail, my database records are 20+
                done();
            });
        });
    });
});

我的calendar.Connect()calendar.getAll()都是承诺:

var express = require('express');
var sql = require('mssql');

var config = require('./../config');
var calendarDbConnection = {};

calendarDbConnection.Connect = function() {
    return sql.connect(config.mssql);    
}

calendarDbConnection.getAll = function () {
    var promise =  new sql.Request()
        .query('select * from CalendarTable')
        .catch(function (err) {
            console.log(err.message);
        });
    return promise;
}

module.exports = calendarDbConnection;

然而,在运行我的测试时,我得到以下输出:

enter image description here

当我在上一个done()之后调用then()时,函数会得到解决,但我的测试结果却没有。我从数据库中获得的行数超过20,我检查它们是否等于5.因此,我的测试应该失败,但事实并非如此。

//previous code
.then(function (returnValue) {
     expect(returnValue.count).to.equal(5); //This should fail, my database records are 20+
     });
     done();
//...

所以这最后的结果通过了我的测试,但它不应该。

我在这里缺少什么?我正在调用回调函数,但后来我的预期结果不正确。

2 个答案:

答案 0 :(得分:3)

由于您从测试中返回了Promise,因此should notdone作为参数传递:

  

或者,您可以返回Promise,而不是使用done()回调。如果您正在测试的API返回promises而不是回调,那么这很有用。

虽然您可以如上所述将done传递给catch来电,但摆脱done并返回承诺似乎更方便。

it("should get stuff from the database", function () {
    return calendar.Connect() // returns Promise, so no `done`
    .then(function () {
        return calendar.getAll();
    })
    .then(function (returnValue) {
        expect(returnValue.count).to.equal(5);
    });
});

答案 1 :(得分:0)

只在传球中完成传球。

then(....) { ... done(); }.catch(done);