On 2008-12-05, at 10:06, Daniel Lopes wrote:
> Thanks for help and sorry for insistance but I don't understand
> aspects on rspec ( I think not understand how we use mocks and stubs):
Hi Daniel. If you're a bit unsure about when to use mocks vs stubs,
have a read of this article by Martin Fowler:
http://martinfowler.com/articles/mocksArentStubs.html
The short version of that article is:
-You mock objects: @photo = mock_model Photo
-You stub methods: @photo.stub!(:height).and_return(123)
> The behavior of my controller is...
> Before Filter:
> check_administrator_role
> load_user
Are you using Authlogic?
> So, in this case I want run my before filter methods in before block
> on rspec, like below:
Nope! =) before-filters are called when a controller action is
called; they aren't called in your specs' "before" blocks.
> describe PropertiesController do
> def mock_property(stubs={})
> @mock_property ||= mock_model(Property, stubs)
> end
>> before do
> @current_user = mock_model(User, :id => 1) <== define a
> current_user with id 1
> controller.stub!(:check_administrator_role).and_return(true) <==
> and current_user is administrator
> @params = {:user_id=>1} <== define params
> User.stub!(:find).with(@params[:user_id]).and_return(@user) <==
> and now try fetch the user with id 1
> end
Keep in mind that it's
before :each do
or
before :all do
> This line will define @user variable, right?
> User.stub!(:find).with(@params[:user_id]).and_return(@user)
That line above tells the User class to return @user when #find is
called on it with the argument @params[:user_id] .
You don't need to create a "params" variable. Eg:
before :each do
@user = mock_model User
controller.stub!(:check_administrator_role).and_return(true)
User.stub!(:find).and_return @user
end
> But I don't need mock the @user variable to fill it with valid
> values ( like user_id, name, email and etc ) ?
If you want those methods, you'd stub them on @user, like this:
@user = mock_model User, :name => 'Bob'
or like this:
@user = mock_model User
# ..some other code here..
@user.stub!(:name).with(no_args).and_return('Bob')
> describe "responding to GET index" do
> it "should expose all properties of given user as @properties" do
> @user.should_receive(:properties).and_return([mock_property])
> get :index
> assigns[:properties].should == [mock_property]
> end
> end
That looks about right.
-Nick