FactoryGirl-验证失败:时区未包含在列表中 [英] FactoryGirl - Validation failed: Time zone is not included in the list

查看:70
本文介绍了FactoryGirl-验证失败:时区未包含在列表中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Rspec,FactoryGirl和Capybara。使用ActiveSupport :: TimeZone.us_zones时。我为 requests / users_spec 运行测试,由于出厂时出现问题,它甚至没有通过测试。错误如下:

I'm using Rspec, FactoryGirl and Capybara. When using ActiveSupport::TimeZone.us_zones. I run my test for my requests/users_spec and it doesn't even hit the test as it has an issue at the Factory. Here is the error:

 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 <top (required)>'

这是我的设置:

应用程序/模型/用户.rb

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :email, :password, :remember_me, :username, :time_zone

  validates_presence_of :username
  validates_presence_of :time_zone
  validates_format_of :username, :with => /^(?=(.*[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 / 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

spec / 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

spec / support / 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

当我为用户运行测试时该模型通常会通过所有测试。为什么它实际上不能识别为时区?

When I run test for my user model in general it passes all test. Why doesn't it recognize as a Time Zone when it really is?

ANSWER

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

In my User.rb model I had to do:

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

我的视图:

<%= f.time_zone_select :time_zone, ActiveSupport::TimeZone.us_zones, {:prompt => "Select Your Time Zone *"} %>

如果您有来自水豚的测试请求:

And if you have a test request from Capybara:

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

祝你好运。

推荐答案

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

Convert array of timezones to array of strings in your user model validations.

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

这篇关于FactoryGirl-验证失败:时区未包含在列表中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆