ruby on rails - example - ¿Por qué esta especificación de solicitud rspec no actualiza el modelo?
rails selenium (1)
usted se deja engañar por el aspecto de los marcos de prueba inteligentes :) seguramente espera que cambie la entrada de db para user_to_edit
. user_to_edit
es una variable local para que user_to_edit.last_name
no cambie independientemente de los botones en los que haga clic. prueba con { user_to_edit.reload.last_name }
Tengo una especificación de solicitudes para las interacciones con el modelo de usuario. Quiero asegurarme de que los usuarios con la función de administrador puedan crear / editar / destruir usuarios. Tengo un problema en este momento donde la acción Editar no actualiza al usuario. Todo funciona correctamente cuando realizo manualmente las acciones en el sitio, pero las pruebas no actualizan al usuario.
Aquí está mi especificación:
it ''edits a user'' do
@user = FactoryGirl.create(:user)
visit new_user_session_path unless current_path == new_user_session_path
fill_in "Email", :with => @user.email
fill_in "Password", :with => @user.password
click_button "Sign In"
user_to_edit = FactoryGirl.create(:user, first_name: "John", last_name: "Smith")
visit edit_user_path(user_to_edit) unless current_path == edit_user_path(user_to_edit)
fill_in ''user_last_name'', with: "Changed"
expect{
click_button "Do it"
}.to change { user_to_edit.last_name }.from("Smith").to("Changed")
page.should have_content "John Changed"
end
El error que obtengo es:
Failure/Error: expect{
result should have been changed to "Changed", but is now "Smith"
Si cambio las últimas líneas de la prueba a esto:
fill_in ''user_last_name'', with: "Changed"
click_button "Do it"
page.should have_content "John Changed"
Entonces la prueba tiene éxito. Esto no parece correcto, ya que la página no debería mostrar "John Changed" si user_to_edit
no se actualizó.
Mi especificación de solicitud de eliminación funciona bien:
it "deletes a user" do
@user = FactoryGirl.create(:user)
visit new_user_session_path unless current_path == new_user_session_path
fill_in "Email", :with => @user.email
fill_in "Password", :with => @user.password
click_button "Sign In"
user_to_delete = FactoryGirl.create(:user, first_name: "John", last_name: "Smith")
visit users_path unless current_path == users_path
expect{
within ".user_#{user_to_delete.id}" do
click_link ''Delete''
end
}.to change(User,:count).by(-1)
page.should_not have_content "John Smith"
end
Tengo un modelo de usuario:
class User < ActiveRecord::Base
ROLES = %w[renter landlord admin]
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable
attr_accessible :email, :password, :password_confirmation :first_name, :last_name, :role
validates :password, :presence => true, :on => :create
validates :first_name, :presence => true
validates :last_name, :presence => true
before_save :set_phones
def set_phones
self.fax = Phoner::Phone.parse(self.fax).format("%a%n") unless self.fax.blank?
self.land_phone = Phoner::Phone.parse(self.land_phone).format("%a%n") unless land_phone.blank?
self.mobile_phone = Phoner::Phone.parse(self.mobile_phone).format("%a%n") unless mobile_phone.blank?
end
end
Tengo esta fábrica:
require ''faker''
FactoryGirl.define do
factory :user do |f|
f.first_name { Faker::Name.first_name }
f.last_name { Faker::Name.last_name }
f.email {Faker::Internet.email}
f.password { "oq2847hrowihgfoigq278o4r7qgo4" }
f.role { "admin" }
end
end
Tengo estas acciones en mi controlador de usuario:
def edit
@user = User.find_by_id(params[:id])
respond_to do |format|
format.html
end
end
def update
if params[:user][:password].blank?
[:password,:password_confirmation].collect{|p| params[:user].delete(p) }
end
respond_to do |format|
if @user.errors[:base].empty? and @user.update_attributes(params[:user])
flash.now[:notice] = "Your account has been updated"
format.html { render :action => :show }
else
format.html { render :action => :edit, :status => :unprocessable_entity }
end
end
end
El archivo routes.rb
también es relevante, ya que estoy usando Devise y tengo un controlador de usuarios personalizado:
devise_for :users, :skip => [:sessions, :registrations]
devise_scope :user do
get "login" => "devise/sessions#new", :as => :new_user_session
post ''login'' => ''devise/sessions#create'', :as => :user_session
delete "logout" => "devise/sessions#destroy", :as => :destroy_user_session
get "signup" => "devise/registrations#new", :as => :new_user_registration
put "update-registration" => "devise/registrations#update", :as => :update_user_registration
delete "delete-registration" => "devise/registrations#destroy", :as => :delete_user_registration
get "edit-registration" => "devise/registrations#edit", :as => :edit_user_registration
get "cancel-registration" => "devise/registrations#cancel", :as => :cancel_user_registration
post "create-registration" => "devise/registrations#create", :as => :user_registration
end
resources :users, :controller => "users"