gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:29:28 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com