ruby-on-rails - 如何在 postgres 中设置时间以便使用 RSpec 测试时区行为?

标签 ruby-on-rails postgresql rspec

我希望能够跨不同时区测试调度程序组件的行为。但是,触发计划行为的功能使用 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/

相关文章:

css - rails : Problems with Asset Pipelin/SASS

ruby-on-rails - 向 friend 展示您本地的 Rails 项目时,您更喜欢什么?

sql - 为什么我的 ActiveRecord order 方法拒绝了解来自 select 方法的派生列?

sql - 动态查询创建和执行 PostgreSQL

ruby-on-rails - 如何 rspec 模拟 ruby​​ rails 记录器类

testing - rspec 没有收到保存方法

ruby-on-rails - Rails render_to_string 使用错误的格式

ruby-on-rails - 如何断言它使用正确的 json 呈现?

ruby-on-rails - Rails 2.3 和 Rails 3.2 'weeks' 方法的区别

ruby-on-rails - 推送到 Heroku 时带有 Postgres 的 Rails 迁移错误