2016-04-29 123 views
2

我有一个测试失败,因为使用摩卡超时。 我确实称之为“完成()”功能,但由于某种原因似乎不起作用。嵌套承诺 - 摩卡 - 超时超时

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

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

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

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

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

我在这里错过了什么?我正在调用回调函数,但是我的预期结果不正确。

+0

您不捕获任何抛出的错误。在链的末尾添加一个'.catch'? – CodingIntrigue

+0

更新了我的问题,这有效,但我的测试通过了这种情况。我认为'期望'会让这个测试本身失败,没有必要的catch块。 – Tikkes

+0

找到了!如果我自己抓住了我的“完成”,它就会像我所期望的那样符合断言。即“then(....){... done(); } .catch(done);'谢谢你的帮助,随时张贴这个答案让我接受。 – Tikkes

回答

3

,因为你是从测试返回一个承诺,你should notdone作为参数:

或者,而不是使用()完成回调,可能会返回一个承诺。如果您正在测试的API返回承诺而不是回调,这很有用。

虽然你可以通过donecatch通话如上所述,似乎更方便摆脱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); 
    }); 
}); 
0

只通过了渔获。

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

更简单的做什么接受的答案表明:只是回报承诺。 – Louis