我希望能够跨不同时区测试调度程序组件的行为。但是,触发计划行为的功能使用 postgres 中基于时间的查询:
例如
# find reminders which have not been sent for "today" in the local date
Schedule.where('evening_reminder_last_sent_on_local_date !=
DATE( NOW() AT TIME ZONE time_zone )')
我希望能够在 RSpec 中测试此行为并确保它在一天中正确播放,如果我在世界标准时间 12 月 25 日凌晨 1 点向日本用户发送提醒,然后在世界标准时间晚上 10 点,他们提醒“今天”将显示为未已发送(因为在日本是第二天早上 7 点左右)。
但是,为了做到这一点,我需要能够在 postgres 中设置日期时间。这可能吗?
请注意...这不是关于停止 Rails 的时间
挑战不在于在 Rails 中打桩时间——我知道该怎么做。问题是如何在 Postgres 中设置时间。
最佳答案
Postgres 使用底层操作系统的日期/时间设置(至少在类 UNIX 系统上)。要暂存各种时间戳,您必须使用 date
命令设置操作系统的时间。
我当然不会推荐在一个做任何其他重要事情的系统上。 cronjobs 可能会出现困惑和其他令人不快的副作用。
相反,将函数 now()
替换为用户定义的服务器端函数,例如:
CREATE OR REPLACE FUNCTION now_test()
RETURNS timestamptz AS $func$SELECT '2013-12-01 12:34'::timestamptz$func$ LANGUAGE SQL;
(以上强制转换假定 session 的当前时区设置。或者,您可以使用文字提供时区或时间偏移量。)
然后你可以测试你的代码:
Schedule.where('evening_reminder_last_sent_on_local_date !=
DATE(now_test() AT TIME ZONE time_zone)')
用各种时间戳修改上面的 SQL 函数,你就可以开始了。
关于ruby-on-rails - 如何在 postgres 中设置时间以便使用 RSpec 测试时区行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20314197/