使用Mocha和Chai编写testing用例

我有一个简单的函数:

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/14-09:00:00') ,我得到以下回应:

 [ { from: '2014/09/13-10:00:00', to: '2014/09/14-09:00:00' } ] 

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

 var expect = require("chai").expect; var utils = require("../Utils.js"); describe("Utils", function(){ describe("#splitIntoDays()", function(){ var timeIntervals = []; var results = utils.splitIntoDays('2014/09/13-10:00:00','2014/09/14-09:00:00'); timeIntervals.push({ "from": '2014/09/13-10:00:00', "to": '2014/09/14-09:00:00' }); expect(results).to.equal(timeIntervals); }); }); 

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

你需要把你的testing包装进来,你需要使用deep.equal 。 例如:

 it("equal", function () { expect(results).to.deep.equal(timeIntervals); }); 

equal自己将检查对象是严格等于=== 。 在您的计算机上启动节点,然后在提示符下键入[] === [] 。 你会得到false的结果。 这是因为你有两个Array对象,如果对象不是同一个实例,严格的相等性检查将失败。

这个电话是必要的,因为这是你如何告诉摩卡“这里是一个testing你运行”。 describe调用声明testing套件,但不自己声明任何testing。