rails example ruby-on-rails devise capybara cancan rspec-rails

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"