TimeWithZone和Time.zone.now集成测试失败

Nic*_*ick 15 ruby integration-testing ruby-on-rails ruby-on-rails-4

在控制器方法中,我将用户的变量设置为activation_sent_at等于Time.zone.now向该用户发送激活电子邮件的时间.在开发服务器上,这似乎有效(尽管我的应用程序中的时间表达式在我的计算机的本地时间落后2小时).

我想要包含一个集成测试,测试是否activation_sent_at确实设置得当.所以我加入了这条线:

assert_equal @user.activation_sent_at, Time.zone.now
Run Code Online (Sandbox Code Playgroud)

但是,这会产生错误:

No visible difference in the ActiveSupport::TimeWithZone#inspect output.
You should look at the implementation of #== on ActiveSupport::TimeWithZone or its members.
Run Code Online (Sandbox Code Playgroud)

我认为它建议Time.zone.now在我的测试中使用另一个表达式.我查看了不同的来源,包括http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html,但我不知道该怎么做.什么可能导致此错误的任何建议?

附加信息:添加puts Time.zone.nowputs @stakeholder.activation_sent_at确认两者相等.不确定是什么导致失败/错误.

AbM*_*AbM 30

问题是两个日期彼此非常接近但不一样.您可以使用assert_in_delta

assert_in_delta @user.activation_sent_at, Time.zone.now, 1.second

对于RSpec,类似的方法是使用be_within:

expect(@user.activation_sent_at).to be_within(1.second).of Time.zone.now