2010-11-11 54 views
0

我不确定你们是否像这样测试,但我是一个TDD家伙,并一直陷入奇怪的东西。时间戳由DJ以某种方式转换,或时区......我不知道。测试例子如下延迟作业转换时间,给出奇怪的摩卡期望错误

我使用delayed_job的2.0.3

data = {:value => 0.856, :timestamp => Time.zone.now} 
job = MyMailer.send_later :send_values, data, emails 

MyMailer.expects(:send_values).with(data, emails).once 
job.payload_object.perform 

class MyMailer 
    def self.send_values(data, emails) 

    end 
end 

OK,测试预期失败

unexpected invocation: MyMailer.send_values({:value => 0.856576407208833, :timestamp => Thu Nov 11 22:01:00 UTC 2010 (1289512860.94962 secs)}, .. 
unsatisfied expectations: 
- expected exactly once, not yet invoked: MyMailer.send_values({:value => 0.856576407208833, :timestamp => Thu, 11 Nov 2010 23:01:00 CET +01:00}... 

与日期时间是差不多,DateTime.now代替Time.zone.now

got  :timestamp => Thu Nov 11 23:13:33 +0100 2010 (1289513613.0 secs) 
expected :timestamp => 2010-11-11T23:13:33+01:00 

发生了什么?我如何控制它(我想要)?

回答

1

我以为我第一次看到这个问题时就已经有了答案。但我现在不再了,所以这里是一个猜测:

由于Time.zone.now,DateTime.now和Time.now彼此略有不同,Zone是Rails创建的(我认为),难道你的测试框架中某处的ruby错过了该区域? Time.zone.now.to_datetime已经从类似的东西中拯救了我。它可以让你使用区域,并且你得到与DateTime.now女巫缺少DateTime.zone.now相同的格式。

Try: data = {:value => 0.856, :timestamp => Time.zone.now.to_datetime} 
+0

你是绝对正确的有关时区是问题,但它不是在插入时间的问题,这是一个问题,当DJ反序列化YAML(句柄),不使用配置Time.zone,只服务器时区(这是一样的Time.now) – oma 2010-11-12 09:01:49

+0

是的,我看到的 - 但是如果你调整Time.zone.now到Time.zone.now.to_datetime是不是会是正确的,你之前插入时? – Christian 2010-11-12 09:21:34