【问题标题】:Nested promises - Mocha - Exceeded timeout嵌套承诺 - 摩卡 - 超过超时
【发布时间】:2016-08-24 09:51:26
【问题描述】:

由于使用 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;

但是,在运行测试时,我得到以下输出:

当我在最后一个then() 之后调用done() 时,函数得到了解决,但我的测试结果却没有。我从数据库中获取的行数超过 20,我检查它们是否等于 5。所以,我的测试应该失败,但它没有。

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

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

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

【问题讨论】:

  • 您没有捕获任何抛出的错误。在链尾添加.catch
  • 更新了我的问题,这可行,但在这种情况下我的测试通过了。我认为expect 会使该测试自行失败,而无需使用所需的 catch 块。
  • 找到了!如果我抓住了我的done 本身,它就会像我预期的那样与断言一起工作。即then(....) { ... done(); }.catch(done); 感谢您的帮助,请随时将其发布为我接受的答案。
  • 如果要增加timeout,可以使用timeout(10000)
  • 请不要编辑问题中的解决方案。解决方案必须作为答案发布。

标签: javascript node.js promise mocha.js


【解决方案1】:

只在接球中完成。

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

【讨论】:

  • 按照公认的答案建议做起来要简单得多:只需返回承诺即可。
【解决方案2】:

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

或者,您可以返回一个 Promise,而不是使用 done() 回调。如果您正在测试的 API 返回 Promise 而不是回调,这将非常有用。

虽然您可以如上所述将done 传递给catch 调用,但摆脱done 并返回一个promise 似乎更方便。

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);
    });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 2015-04-30
    • 2019-06-13
    • 2014-11-22
    • 2019-07-07
    • 2014-03-23
    相关资源
    最近更新 更多