FactoryGirl - Überprüfung fehlgeschlagen: Die Zeitzone ist nicht in der Liste enthalten
Ich benutze Rspec, FactoryGirl und Capybara. Bei Verwendung von ActiveSupport :: TimeZone.us_zones. Ich teste für meinerequests/users_spec
und es hat nicht einmal den Test bestanden, da es in der Fabrik ein Problem gibt. Hier ist der Fehler:
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)>'
Das ist mein Setup:
app / model / user.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 '[email protected]'
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
Wenn ich im Allgemeinen einen Test für mein Benutzermodell durchführe, besteht es alle Tests. Warum erkennt es nicht als Zeitzone, wenn es wirklich ist?
ANTWORTEN
In meinem User.rb-Modell musste ich Folgendes tun:
validates_inclusion_of :time_zone, :in => ActiveSupport::TimeZone.us_zones.map(&:name)
Meine Fabrik:
factory :user do
username 'user1'
email '[email protected]'
time_zone 'Eastern Time (US & Canada)'
password 'testing'
end
Meine Ansichten:
<%= f.time_zone_select :time_zone, ActiveSupport::TimeZone.us_zones, {:prompt => "Select Your Time Zone *"} %>
Und wenn Sie eine Testanfrage von Capybara haben:
page.select('(GMT-10:00) Hawaii', :from => 'Time Zone')
Viel Glück.