Martin Hawkins
2010-Jul-30 10:53 UTC
[rspec-users] Newbie : How to spec params hash amendment
I am new to rspec and am finding it all a bit daunting at the moment.
I''d like to be able to adopt a bdd approach to my development but
I''m
still at the stage of trying to get my head around rspec concepts so
I''m committing the cardinal sin of coding first and then writing
tests.
I am using the following:
Ruby v1.8.7
Rails v2.3.8
Authlogic v2.1.5
Cancan v1.2.0
rspec v1.3.0
rspec-rails v1.3.2
webrat v0.7.1
cucumber-rails v0.3.2
capybara v0.3.9
factory_girl v1.2.4
pickle v0.3.0
no_peeping_toms v1.1.0
email_spec v0.6.2
In spec_helper.rb, I have
def current_user(stubs = {})
@current_user ||= mock_model(User, stubs)
end
def user_session(stubs = {}, user_stubs = {})
@current_user_session ||= mock_model(UserSession, {:user =>
current_user(user_stubs)}.merge(stubs))
end
def login(session_stubs = {}, user_stubs = {})
UserSession.stub!(:find).and_return(user_session(session_stubs,
user_stubs))
end
def logout
@user_session = nil
end
def login_as_admin
login({}, {:role => ''admin''})
@current_user.stub(:role?).with(:admin).and_return(true)
end
In ability.rb (for cancan)
def initialize(user)
user ||= User.new # Guest user
if user.role? :admin
can [:index, :show, :new, :edit, :create, :update, :destroy],
[User, CommonContents, Logo]
else
can [:show, :edit, :update], User
cannot [:index, :show, :new, :edit, :create, :update, :destroy],
[CommonContents, Logo]
end
end
In UserController
def create
# New users can only be created by admins
authorize! :create, User
# When the user is first defined by admin, the password is not set
# Create a random one to satisfy validation requirements, which the
user changes when they first visit
params[:user][:password] = random_password()
params[:user][:password_confirmation] = params[:user][:password]
@user = User.new(params[:user])
if @user.save
redirect_to(@user, :notice => ''User was successfully
created.'')
else
@roles = User.const_get("ADMIN_CAN_CREATE")
render :action => "new"
end
end
I have a private method in ApplicationController as follows:
def random_password(length = 10)
alphanumerics =
[(''0''..''9''),(''A''..''Z''),(''a''..''z'')].map
{|range|
range.to_a}.flatten
(0...length).map
{ alphanumerics[Kernel.rand(alphanumerics.size)] }.join
end
My spec is currently
describe "when authorised as admin" do
describe "POST ''create''" do
before(:each) do
login_as_admin
end
after(:each) do
logout
end
describe "with valid params" do
it "should set password and password_confirmation to the same 10
digit value" do
# ?????
end
end
end
end
I have no idea how to approach ''rspec''ing the creation of the
params[:user][:password] and :password_confirmation or the
random_password method and would very much appreciate it if somebody
could spare the time to suggest what I should be doing.
Elliot Winkler
2010-Aug-02 13:52 UTC
[rspec-users] Newbie : How to spec params hash amendment
On 7/30/10 5:53 AM, Martin Hawkins wrote:> I have no idea how to approach ''rspec''ing the creation of the > params[:user][:password] and :password_confirmation or the > random_password method and would very much appreciate it if somebody > could spare the time to suggest what I should be doing.You could stub the random_password method with some value, then perform the create action, then confirm that the @user variable has that value for password and password_confirmation. (I forget if instance variables are accessible in a controller test even after a redirect, so I guess you''ll find out.) -- Elliot