2017-03-16 33 views
1

我是单元测试的新手,我需要测试一个函数来测量自创建reddit文章以来所经历的时间。硬编码的论点现在正在工作,但随着时间的推移测试将失败。如何使用摩卡,柴,Sinon对动态日期/时间进行单元测试

例如,一个用硬编码参数输出“1天前”的测试今天就会通过,但是不会明天通过,因为它将在帖子发布后2天。测量小时数时采用相同的概念。

这里是我的功能,该created_utc时间戳(一个数字,如1488420682)转换成时间的人类可读的量经过:

PostCluster.js

getElapsedHours(created_utc) { 
    const seconds = created_utc; 
    const epoch = new Date(1970, 0, 1); 
    const timeStamp = new Date(epoch.setSeconds(seconds)); 
    const now = new Date(); 
    const delta = timeStamp - now; 
    const currentTimeZoneOffsetInHours = now.getTimezoneOffset()/60; 
    const hoursElapsed = Math.floor(Math.abs((delta/1000)/3600) + currentTimeZoneOffsetInHours); 

    if (hoursElapsed > 24) { 
    const days = Math.floor(hoursElapsed/24); 
    if (hoursElapsed > 48) { 
     return `${days} days`; 
    } return '1 day'; 
    } else { 
    if (hoursElapsed === 1) { 
     return '1 hour'; 
    } else if (hoursElapsed < 1) { 
     return 'less than 1 hour'; 
    } else { 
     return `${hoursElapsed} hours`; 
    } 
    } 
} 

Here's an example of the outputs displayed in action

的下面的测试按原样传递,因为自该时间戳以来经过的时间总是大于48小时。但是......我如何编写测试来检查输出“1天,1小时,x小时,小于1小时”,并且每次他们在将来运行时都会通过

postcluster.spec.js

describe('<PostCluster />',() => { 

    it("ensures getElapsedHours returns 'x days' when greater than 48 hours",() => { 
    const days = PostCluster.prototype.getElapsedHours(1488420682).split(' ')[1]; 
    expect(days).to.equal('days'); 
    }); 

}); 

我见过MockDate使用,但不知道如何可以在这里申请。

+0

林不知道你正在尝试做的。当检查时间已过时,我通常会执行'(current_epoch - created_epoch)'这将给出秒或毫秒,等待如果您的纪元是ms或s。 – LostJon

+0

这个小老鼠可能会帮助http://stackoverflow.com/questions/4631928/convert-utc-epoch-to-local-date-with-javascript – LostJon

+0

我的功能正确地转换时间,这不是问题。我想知道你如何对不断变化的东西进行单元测试(因为时间流逝总会增加) –

回答

1

你应该为每一种情况下创建一些模拟数据:

  • 1 day
  • x days
  • 1 hour
  • less than 1 hour
  • x hours

例如,对于x days您生成比目前老人凭x天的新日期:

it("ensures getElapsedHours returns 'x days' when greater than 48 hours",() => { 
    var days = 3; 
    var moreThanThreeDaysInMillisecs = 1000 * 3601 * days * 24; 
    var dateMoreThanThreeDays = Date.now() - moreThanThreeDaysInMillisecs; 
    ... 
}) 

和测试对抗。

您不应该使用实时数据进行测试,因为它是易失性的,您的测试可能因此而失败。创建一些模拟数据并单独测试每个公共函数/方法。

0

好吧......我可能已经过早地评论,但下面可能为你工作

function demo(created_utc) { 
    var elapsed_seconds = (new Date() - (created_utc * 1000))/1000 
    if (elapsed_seconds >= 172800) return Math.floor(elapsed_seconds /86400).toString() + " days ago"; 
    else if(elapsed_seconds >= 86400) return "about 1 day ago" 
    else if(elapsed_seconds >= 7200) return Math.floor(elapsed_seconds /3600).toString() + " hours ago"; 
    else if(elapsed_seconds >= 3600) return "about an hour ago" 
    else return "less than an hour ago" 
}; 

为了测试这个功能,我可能会推动数据这总是与当前时间。所以,我需要弄清楚created_utc以正确测试每个场景。

要做到这一点,在我的预料发言,我会像

var epoch_hour = (new Date()/1000) - 3600 
expect(demo(epoch_hour)).to.contain("about an hour"); 
相关问题