测试 测试时区问题

freedomprogramer · 2013年04月18日 · 最后由 kgen 回复于 2013年04月19日 · 2808 次阅读

就是我的测试在设置时区以前都是正确的,当我在application.rb文件中进行了如下设置:

config.time_zone = 'Beijing' config.active_record.default_timezone = 'Beijing' 之后就包错了:

expected: "{\"created_at\":\"2013-04-19T01:16:45+08:00\",\"id\":1,\"status\":\"undo\",\"task_name\":\"learn css\",\"updated_at\":\"2013-04-19T01:16:45+08:00\",\"user_id\":1}" got: "{\"created_at\":\"2013-04-18T17:16:45+08:00\",\"id\":1,\"status\":\"undo\",\"task_name\":\"learn css\",\"updated_at\":\"2013-04-18T17:16:45+08:00\",\"user_id\":1}"

请问大家这个怎么解决啊?(我用的是 rspec 测试)

测试代码都不贴怎么帮你看...

哦哦

describe "POST create" do before(:each) do @attr = { task_name: 'learn css', status: 'undo' } end

it "should return a json" do post :create, task: @attr, :format => :json

expect(response.body).to eq(Task.first.to_json) end end

config.active_record.default_timezone = 'Beijing' 是错误的做法

现在纯属新手,那么更好的做法是什么呢?

config.active_record.default_timezone = :local

#3 楼 @kgen 我也请问 应该怎么做呢

#4 楼 @freedomProgramer #5 楼 @zj0713001 不要设置这个,直接一句 config.time_zone = 'xxx' 即可。 数据库应该存储 UTC 时间,然后所有 ActiveRecord 操作都会根据 config.time_zone 来返回换算后的时间,这一切是自动的。

#6 楼 @kgen 不会啊 要是不设置 active_record 的 timezone timestamps 的时间不会帮我转的呀 是不是别的地方还有设置?我们也是刚升 rails3 就出了这个问题了

@kgen 恩,我注释掉了 activerecord 那句程序是正确执行的

#7 楼 @zj0713001 肯定你其他地方出现了问题,再仔细检查一下吧。

#9 楼 @kgen 怎么查呢 存的时候 created_at 是 UTC 时间 console 和跑起来都只能拿到 UTC 时间的 created_at...

#9 楼 @kgen 麻烦有空帮忙看下...

#11 楼 @zj0713001 你新开一个干净的 Rails3 项目,调通了再来看原来的项目会好得多。

#12 楼 @kgen 关键是 这个就是新开的 created_at 显示的 Time 对象 是自动帮我转了 local 时间 但是 to_s(:db) 还是 UTC 发现问题了 可是为什么呢...

#12 楼 @kgen 看了看文档 :db format outputs time in UTC; all others output time in local. Uses TimeWithZone’s strftime, so %Z and %z work correctly. 不知道为什么这么设计... 项目里所有的 time 都用了 to_s(:db) 刚升的 3 所以没办法了 没法一个一个改啊

不要用 to_s(:db) 来显示时间! 常规的做法是 l(xxx_time, format: :long)

#15 楼 @kgen 任何没有全项目查找替换的编辑器都不是好编辑器 :-D

需要 登录 后方可回复, 如果你还没有账号请 注册新账号