Forum: RSpec NameError when passing a URL helper to a method

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Nick H. (Guest)
on 2008-12-04 22:41
(Received via mailing list)
Hi guys. I just wrote a small spec helper method to DRY up some of my
specs, and found that passing a URL helper (Eg: #photos_url) to a
method results in a NameError error. I extracted the problem into its
own short spec file to isolate it. Any thoughts on what's going on?:
http://gist.github.com/32060

Thanks for your help,
Nick
Zach D. (Guest)
on 2008-12-05 00:07
(Received via mailing list)
On Thu, Dec 4, 2008 at 3:41 PM, Nick H. <removed_email_address@domain.invalid>
wrote:
> Hi guys. I just wrote a small spec helper method to DRY up some of my specs,
> and found that passing a URL helper (Eg: #photos_url) to a method results in
> a NameError error. I extracted the problem into its own short spec file to
> isolate it. Any thoughts on what's going on?:
> http://gist.github.com/32060

foo(properties_url) is being executed in the context of the describe
block and not in the instance of an example being run. For example:

describe FooController do
   it "has access to routing methods here" do
      properties_url
   end

   # it doesn't have access out here though, this fails
   properties_url

   # your example will fail to
  foo(properties_url)
end


--
Zach D.
http://www.continuousthinking.com
http://www.mutuallyhuman.com
Nick H. (Guest)
on 2008-12-05 00:47
(Received via mailing list)
On 2008-12-04, at 17:06, Zach D. wrote:
>
>
>   # your example will fail to
>  foo(properties_url)
> end
> --
> Zach D.

Hi Zach. Thanks for that explanation; it makes a lot of sense. What
I'm trying to do is write a spec helper method for DRYing up
controller redirect examples. In other words, rather than having the
following 4 lines repeated throughout my specs:
   it 'should redirect to the account page' do
     do_action
     response.should redirect_to account_url
   end

I'd like to do this:
   it_should_redirect_to 'the account page', account_url

I've written the method. The only problem is what you explained;
#account_url being called from outside of an example.

The only solution that I can think of is to do this:
   before :each do
     @account_url = account_url
   end
   it_should_redirect_to 'the account page', @account_url

Are there any alternative solutions? Cheers,
Nick
Nick H. (Guest)
on 2008-12-05 00:50
(Received via mailing list)
On 2008-12-04, at 17:43, Nick H. wrote:
> The only solution that I can think of is to do this:
>  before :each do
>    @account_url = account_url
>  end
>  it_should_redirect_to 'the account page', @account_url

Actually, that suggestion above of mine doesn't work. It fails with:
   You have a nil object when you didn't expect it!
   The error occurred while evaluating nil.rewrite
   (eval):17:in `account_url'

I thought of it while writing that last email, but didn't test it
before hitting send.
-Nick
Pat M. (Guest)
on 2008-12-05 01:02
(Received via mailing list)
Nick H. <removed_email_address@domain.invalid> writes:

> removed_email_address@domain.invalid
> http://rubyforge.org/mailman/listinfo/rspec-users

Check out my attempt: http://gist.github.com/32130  I don't know which
one is correct.

Pat
Pat M. (Guest)
on 2008-12-05 02:57
(Received via mailing list)
Nick H. <removed_email_address@domain.invalid> writes:

>   (eval):17:in `account_url'
>
> I thought of it while writing that last email, but didn't test it
> before hitting send.
> -Nick
> _______________________________________________
> rspec-users mailing list
> removed_email_address@domain.invalid
> http://rubyforge.org/mailman/listinfo/rspec-users

It's the same as

class Foo
  @class_instance_variable = "blah"

  def foo
    puts @class_instance_variable
  end
end

Foo.foo will print nothing, because @class_instance_variable is nil in
the object instance.

Anyway, I thought of an even cleaner way to do things than using a
block, assuming you only care about calling one method:

do_something(:blah_url_helper)

def do_something(helper_name)
  send(helper_name)
end

Pat
Mark W. (Guest)
on 2008-12-05 03:28
(Received via mailing list)
On Thu, Dec 4, 2008 at 4:56 PM, Pat M. <removed_email_address@domain.invalid> 
wrote:

>
I don't know if it matters here, but you can define a class method to
return
a class instance variable.

///ark
Nick H. (Guest)
on 2008-12-05 20:06
(Received via mailing list)
On 2008-12-04, at 19:56, Pat M. wrote:
>>  The error occurred while evaluating nil.rewrite
> It's the same as
> the object instance.
> Pat
Hi Pat. That's a great suggestion. Here's what I ended up doing:
http://gist.github.com/32424

Thanks,
Nick
This topic is locked and can not be replied to.