On Wed, Jul 22, 2009 at 9:12 AM, amkirwan<[email protected]> wrote:
> My spec is a messed up because I have tried everything I can think of
> to mock but this is what I have for the show method. The @user
> instance is setup in the login_and_before_filter_pass macros with the
> following: @user = mock_model(Person, :null_object => true)
>
> The error I keep receiving is that assigns[:letter].should equal
> @letter keeps return that it is expecting a Person object instead of a
> Letter object. The only way I can get it to pass is by putting
> @user.letters.should_receive(:find).with("1").and_return(@letter)
> directly in the "should assign the found letter for the view"
>
> I feel like I must be missing something about how stubbing and mocking
> work
>
>
> # Get /admin/letters/1
> def show
> id = params[:id]
> �...@letter = �[email protected](id)
> end
>
>
> describe Admin::LettersController, "SHOW GET /admin/letters/1" do
>
> before(:each) do
> �[email protected]_receive(:find).with("1").and_return(@letter)
This @user is an instance variable in the spec, and is not the same
@user that is in the controller.
HTH,
David
> end
>
> def do_get
> put :show, {:id => "1"}, @session
> end
>
> login_and_before_filter_pass(:filter => :admin_only,
> :request_method => :get,
> :action => :show,
> :parameters => {:cas_user => 'ak730'})
>
> it "should be successful" do
> do_get
> response.should be_success
> end
>
> it "should find the letter requested" do
> �[email protected]_receive(:find).with("1").and_return(@letter)
> puts(@letter)
> do_get
> end
>
> it "should assign the found letter for the view" do
> # uncommenting will allow to pass
> # @user.letters.should_receive(:find).with("1").and_return
> (@letter)
> do_get
> assigns[:letter].should equal(@letter)
> end
>
> it "should render show template" do
> do_get
> response.should render_template("show")
> end
>
> end
>
>
>
> On Jul 22, 9:13 am, David Chelimsky <[email protected]> wrote:
>> On Tue, Jul 21, 2009 at 11:21 PM, amkirwan<[email protected]> wrote:
>> > How do I spec this following example from the Agile Rails Book listed
>> > below. I am doing a similar thing in my controller and when I
>> > attempted to change it to the collection way of doing the find I am
>> > unable to get my spec to pass though I know it is working fine as my
>> > cucumber features are passing
>>
>> > old rails way:
>>
>> > def show
>> > @order = Order.find(params[:id])
>> > end
>>
>> > new rails way collection-based:
>>
>> > def show
>> > id = params[:id]
>> > @order = @user.orders.find(id)
>>
>> This code is inherently untestable in an isolated/granular way. Your
>> options are:
>>
>> * write higher level specs that use real data
>> * pros: simplicity and clarity in both code and specs
>> * cons: brittle due to runtime dependency on correct models, runs slow
>>
>> * write a very invasive spec with complex setup and instance_eval to
>> set up the @user
>> * pros: runs fast, no runtime dependency on correct models
>> * cons: brittle due to dependency on internals, complex
>>
>> * refactor the code to make it easier to spec
>> * pros: more highly decoupled code, simpler specs, fast
>> * cons: more work up front, may disregard some of what Rails has to offer
>>
>> Note that the first two options are both brittle, but for different
>> reasons. The first is brittle due to a runtime dependency. That means
>> that when you run the spec the model has to be working correctly for
>> the spec to pass, and a failure could be due to a problem in the model
>> or in the controller.
>>
>> The second is due to a code dependency. That means that when you want
>> to change this code, the spec will have to change as well. This is
>> true of any case in which you use mocks or stubs to varying degrees,
>> and that comes with its own tradeoffs. In this case, the necessary
>> stubbing would be complex and invasive enough that it would be a
>> concern to me.
>>
>> Getting to your original question - what does your spec look like now,
>> and what failure message are you getting?
>>
>> Cheers,
>> David
>>
>> > rescue
>> > redirect_to :action => "index"
>> > end
>> > _______________________________________________
>> > rspec-users mailing list
>> > [email protected]
>> >http://rubyforge.org/mailman/listinfo/rspec-users
>>
>> _______________________________________________
>> rspec-users mailing list
>> [email protected]http://rubyforge.org/mailman/listinfo/rspec-users
> _______________________________________________
> rspec-users mailing list
> [email protected]
> http://rubyforge.org/mailman/listinfo/rspec-users
>
_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users