使用Jasmine测试日期函数的有效方法是什么?

时间:2017-02-28 18:27:11

标签: jasmine karma-jasmine

让我们说我有两个功能

var now = new Date();
var oneDayAgo = now.getTime() - (24 * 60 * 60 * 1000);
var beforeOneDay = [];
var otherEvents = [];

var assignTimeSlots = function(time) {

    if (time < oneDayAgo)
        beforeOneDay.push(time)
    else
        otherEvents.push(time)

}

使用茉莉花测试时间的好方法是什么?

1 个答案:

答案 0 :(得分:0)

您的挑战

我认为您真正感兴趣的是测试assignTimeSlots函数。给你带来挑战的是它取决于函数外定义的全局oneDayAgo变量。这意味着您的测试,并且代码都依赖于该全局字段,这使得事情变得具有挑战性,尤其是当它使用当前时间时,每次运行测试时都会更改。

依赖注入

您可以通过将该变量作为参数注入函数来解决此问题。这允许您控制测试中的当前时间。您不再与系统时钟耦合。

示例

以下是未经测试的,但应该明白......

var assignTimeSlots = function(oneDayAgo, time) {
  if (time < oneDayAgo)
    beforeOneDay.push(time)
  else
    otherEvents.push(time)
}

it ('should be added to "beforeOneDay" if it is prior to yesterday', function() {
  var oneDayAgo = new Date(2017, 1, 27, 13, 35);
  var now = new Date(2017, 1, 28, 13, 36);
  assignTimeSlots(now, oneDayAgo);
  expect(beforeOneDay[0]).toBe(now);
  expect(otherEvents.length).toBe(0);
});