2017-02-28 42 views
0

让我们说我有两个功能使用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) 

} 

会是怎样利用茉莉测试时间的好办法?

+0

[茉莉模拟日期构造函数(可能的重复http://stackoverflow.com/ question/26152796/mock-date-constructor-with-jasmine) – mikeapr4

回答

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

嗯......那么我们如何确保我们不会在测试用例中硬编码一段时间,以确保任何日期都能与该函数一起使用? –

+0

用两个不同的'oneDayAgo'值调用它两次。 –

+0

但这意味着我们需要在每次运行测试用例时更改测试用例。 'oneDayAgo'取决于当前的时间,所以如果我们在测试中对日期进行硬编码,测试将在几个星期后不再有用。 –

相关问题