使用Mocha和Chai编写testing用例,以便使用Error

我有一个简单的函数:

var moment = require('moment-timezone'); exports.splitIntoDays = function(from,to) { var timeIntervals = []; var interval = {}; var start = moment(from); var end = moment(to); if(start.isAfter(end)) { throw new Error('From date ('+from+') is after To date ('+to+').Enter a valid date range.'); } var initial = start; console.log("Before loop"+initial.format("YYYY/MM/DD-HH:mm:ss")+" "+initial.diff(end,'hours')); while(end.diff(initial,'hours') > 24) { timeIntervals.push({"from" : initial.format("YYYY/MM/DD-HH:mm:ss"), "to" : initial.add(24,'hours').format("YYYY/MM/DD-HH:mm:ss")}); initial = initial.add(1,'hours'); } timeIntervals.push({"from" : initial.format("YYYY/MM/DD-HH:mm:ss"), "to" : end.format("YYYY/MM/DD-HH:mm:ss")}); console.info(JSON.stringify(timeIntervals)); return timeIntervals; } 

所以,如果我叫它splitIntoDays('2014/09/13-10:00:00','2014/09/12-09:00:00') ,我得到以下回应:

 Error: From date (2014/09/13-10:00:00) is after To date (2014/09/12-09:00:00).Enter a valid date range. 

我用摩卡和柴写了下面的testing:

 var expect = require("chai").expect; var utils = require("../Utils.js"); describe("Utils", function(){ describe("#splitIntoDays()", function(){ it("equal", function () { var results = utils.splitIntoDays('2014/09/13-10:00:00','2014/09/12-09:00:00'); expect(utils.splitIntoDays('2014/09/13-10:00:00','2014/09/12-09:00:00')).to.throw(new Error('From date (2014/09/13-10:00:00) is after To date (2014/09/12-09:00:00).Enter a valid date range.')); }); }); }); 

但是,这个失败了。 你能帮我指出一个错误吗?

我也试着尝试以下内容:

 describe("Utils", function(){ describe("#splitIntoDays()", function(){ var error = new Error('From date (2014/09/13-10:00:00) is after To date (2014/09/12-09:00:00).Enter a valid date range.'); it("equal", function () { expect(function(){ utils.splitIntoDays('2014/09/13-10:00:00','2014/09/12-09:00:00'); }).to.throw(error); }); }); }); 

我得到以下内容:

 AssertionError: expected [Function] to throw 'Error: From date (2014/09/13-10:00:00) is after To date (2014/09/12-09:00:00).Enter a valid date range.' but 'Error: From date (2014/09/13-10:00:00) is after To date (2014/09/12-09:00:00).Enter a valid date range.' was thrown 

你可以在这里find答案: 摩卡/柴expect.to.throw不捕捉抛出的错误 。

基本上,你必须传递一个函数expect()。 现在你传递结果。

编辑:粘贴从我的评论哪个工作的例子。

 var expect = require('chai').expect; describe('test', function(){ var utils = { splitIntoDays : function(from, to){ throw new Error('Invalid date range.'); } } it('throws errors', function(){ expect(utils.splitIntoDays.bind(utils, '2014/09/13-10:00:00', '2014/09/12-09:00:00')).to.throw(Error, 'Invalid date range.'); }); });