在Rspec测试中无法识别ActiveSupport :: TimeZone

时间:2013-05-02 21:06:23

标签: ruby rspec timezone activesupport zipcode

我正在使用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方法时,它会在“ActiveSupport :: TimeZone”中使用“未定义的方法'find_by_zipcode'错误输出

我在规范助手中也加入了“require'active_support / time_with_zone'”。

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

任何想法都会很棒。

1 个答案:

答案 0 :(得分: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所述的方法之一。

相关问题