FactoryGirl – validation失败:时区未包含在列表中

我正在使用Rspec,FactoryGirl和Capybara。 使用ActiveSupport :: TimeZone.us_zones时。 我为我的requests/users_spec运行我的测试,它甚至没有达到测试,因为它在工厂有问题。 这是错误:

  Failure/Error: make_user_and_login ActiveRecord::RecordInvalid: Validation failed: Time zone is not included in the list # ./spec/support/user_macros.rb:3:in `make_user_and_login' # ./spec/requests/users_spec.rb:7:in `block (3 levels) in ' 

这是我的设置:

应用程序/模型/ user.rb

 class User  /^(?=(.*[a-zA-Z]){3})[a-zA-Z0-9]+$/ validates_uniqueness_of :email validates_uniqueness_of :username, :case_sensitive => false validates_length_of :username, :within => 3..26 validates_inclusion_of :time_zone, :in => ActiveSupport::TimeZone.us_zones end 

投机/ spec_helper.rb

 ENV["RAILS_ENV"] ||= 'test' require File.expand_path("../../config/environment", __FILE__) require 'rspec/rails' require 'rspec/autorun' require 'capybara/rspec' Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} RSpec.configure do |config| config.use_transactional_fixtures = true config.infer_base_class_for_anonymous_controllers = false config.order = "random" config.include(MailerMacros) config.include(UserMacros) end 

投机/ factories.rb

 FactoryGirl.define do factory :user do username 'user1' time_zone '(GMT-05:00) Eastern Time (US & Canada)' email 'user@example.com' password 'testing' end end 

规格/支持/ user_macros.rb

 module UserMacros def make_user_and_login user = FactoryGirl.create(:user) visit login_path page.should have_selector('title', :text => 'Login') fill_in('Email', :with => user.email) fill_in('Password', :with => user.password) click_button('Login') page.should have_selector('title', :text => 'Home') end end 

当我为我的用户模型运行测试时,它会通过所有测试。 为什么它不是真的识别为时区?

回答

在我的User.rb模型中,我必须这样做:

 validates_inclusion_of :time_zone, :in => ActiveSupport::TimeZone.us_zones.map(&:name) 

我的工厂:

 factory :user do username 'user1' email 'user@example.com' time_zone 'Eastern Time (US & Canada)' password 'testing' end 

我的观点:

  "Select Your Time Zone *"} %> 

如果您有Capybara的测试请求:

 page.select('(GMT-10:00) Hawaii', :from => 'Time Zone') 

祝好运。

将时区数组转换为用户模型validation中的字符串数组。

  validates_inclusion_of :time_zone, :in => ActiveSupport::TimeZone.us_zones.map(&:to_s)