【问题标题】:ActiveSupport::TimeZone not recognized in Rspec testsActiveSupport::TimeZone 在 Rspec 测试中无法识别
【发布时间】:2013-04-27 04:43:51
【问题描述】:

我正在使用 ActiveSupport::TimeZone 根据邮政编码设置时区。

def set_time_zone
  self.time_zone = ActiveSupport::TimeZone.find_by_zipcode(self.zip)
end

这在应用程序本身中运行良好。我在 before_save 上调用 set_time_zone。

在使用 Rspec 运行测试时,当它尝试运行 set_time_zone 方法时,它会出错并显示“undefined method 'find_by_zipcode'in ActiveSupport::TimeZone”

我也在我的规范助手中包含了“require 'active_support/time_with_zone'”。

目前我的工作是在测试环境中排除之前的保存。

任何想法都会很棒。

【问题讨论】:

    标签: ruby rspec timezone activesupport zipcode


    【解决方案1】:

    find_by_zipcode 不是主要ActiveSupport::TimeZone 对象的一部分。该对象的文档是 here,您找不到任何关于邮政编码的信息。

    Google 搜索发现该方法是 TZip gem 的一部分。既然你说它在你的应用程序中工作,我猜你那里有那个宝石。您可能只需要将它添加到您的测试项目中。 (抱歉,对 Ruby 或 RSpec 不太熟悉,因此无法指导您)。

    由于对时区非常熟悉,我想我也会借此机会解决一些关于将邮政编码映射到时区的一般想法的问题。我不太确定这是个好主意。

    • 它非常专注于美国。时区遍布全球,邮政编码仅在美国有效。
    • 邮政编码经常更改。 USPS 发布数据库,您可以订阅这些数据库以更改此数据。从TZip commit historyissue tracker 可以看出,在报告问题时,他们一直在手动添加邮政编码映射。这不是处理经常变化的数据的好方法。
    • 邮政编码不是识别位置的最佳边界。有许多邮政编码覆盖不同的、不连续的区域。还有一些行政邮政编码不映射到任何特定位置(例如用于海外军事邮件的邮政编码)。
    • 对于那些为特定邮政编码分配纬度和经度的数据库,这些坐标通常是人为选择的,作为该邮政编码所服务区域的质心的近似值。同样,这不是一个离散的位置。
    • 根据the TZip source code,这些映射仅涵盖7 个时区。他们忘记了也有邮政编码的美国领土,例如关岛。其他国家(例如波多黎各)被错误地映射到东部时区而不是大西洋时区。

    所以我的建议是完全避免这种方法。相反,请使用in this community wiki 描述的方法之一。

    【讨论】:

    • 哦,伙计,我敢打赌这真的很容易;我忘记了测试组中的宝石。让我测试一下,稍后我会更新。
    • 不,将 gem 添加到测试组没有任何作用。
    • @BobRoberts - 如果您确定它已正确添加 - 那么我不确定它为什么会告诉您这是一个未定义的方法。也许有人比我有更多的 Ruby 经验。如果这是 C#,我会说你可能缺少 using 声明。也许this post 对你有意义。
    • @BobRoberts - 但我再次建议不要从一般的邮政编码中查找时区。
    猜你喜欢
    • 2020-09-28
    • 1970-01-01
    • 2015-05-17
    • 2012-11-21
    • 2018-11-04
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多