2010-12-14 35 views
3

我正在编写测试,并且我想知道在测试期间是否有方法更改当前日期?在测试期间模拟当前日期

问题是我正在测试应用程序的统计功能,该应用程序连接到每次调用操作时创建实例的跟踪模型(只通过“before_filter only”调用来跟踪某些操作)

所以我需要调用的不同点这个动作在不同的控制器时间来检验我的分析组件是做出正确的计算,但我没有找到任何方式来实现在下面的示例代码change_current_time:

test "login count" do 
    change_current_time(2.day.ago) 
    get "users/login/testuser/testpassword" 
    assert login_count(2.day.ago) == 1 
    change_current_time(1.day.ago) 
    get "users/login/testuser/testpassword" 
    get "users/login/testuser1/testpassword1" 
    assert login_count(1.day.ago) == 2 
end 

回答

1

这种测试的一种方法是模拟方法/类你想测试。

http://en.wikipedia.org/wiki/Mock_object

的想法是,你可以创建一个相同的功能,除了传递一个日期,而不是依赖于当前的日期,并测试替代。困难来自于确保两个函数真的是等价的,并且保持它们同步的任何变化。

有一些现有的框架和嘲笑,但我不是很熟悉他们推荐给你。

0

在Rails中有嘲笑时间的宝石。
https://github.com/harvesthq/time-warp

time = (2.days.ago) 

pretend_now_is(time) do 
    get "users/login/testuser/testpassword" 
    assert login_count(Date.today) == 1 # it's stubbed 
end 

time = (1.days.ago) 

pretend_now_is(time) do 
    get "users/login/testuser/testpassword" 
    get "users/login/testuser1/testpassword1" 
    assert login_count(Date.today) == 2 
end