How to test the layout of a controller?

I noticed this...

http://bjhess.com/blog/2008/04/27/five-rails-tips/

But it's outdated a bit. What should I do? I get a DEPRECATION WARNING: response.layout has been deprecated. Use template.layout instead. but after googling around I can't find a definitive solution.

It's gotta be simple...

I noticed this...

http://bjhess.com/blog/2008/04/27/five-rails-tips/

But it's outdated a bit. What should I do? I get a DEPRECATION WARNING: response.layout has been deprecated. Use template.layout instead. but after googling around I can't find a definitive solution.

I use this with Rails 3 and RSpec...

require 'spec_helper' describe KidsController do   describe "GET index" do     before(:each) do       get 'index'     end

    it "should use the 'kids' layout" do       response.should render_template('layouts/kids')     end

  end end

And in my KidsController I have the following line:

  layout 'kids'

daze wrote in post #970545:

I noticed this...

http://bjhess.com/blog/2008/04/27/five-rails-tips/

But it's outdated a bit. What should I do? I get a DEPRECATION WARNING: response.layout has been deprecated. Use template.layout instead. but after googling around I can't find a definitive solution.

It's gotta be simple...

You shouldn't be testing the layout of a controller. Instead, you should be testing (with Cucumber) that the view has the content you want.

Remember: test behavior, not implementation. You should ideally be able to change your whole implementation and still have all your tests pass.

Best,

First off, resolving my own issue: Apparently, you can use "assert_template" to test the layout. In my case, I could do

daze wrote in post #970685: [...]

With regard to the idea about testing behavior alone:

That makes a lot of sense. A lot. My question, however, is about how there must be a line to draw. If you were to test that the view has the content you want, wouldn't you HAVE to be testing implementation to an extent, as your view contains tags like e.g. <div class='span-5' id='main'>, and you'd be testing for e.g. a div with id 'main'?

Yes. That's not implementation in the sense that the user actually *sees* it.

It's just not clear to me how...

What part isn't clear?

(...) You should ideally be able to change your whole implementation and still have all your tests pass.

Could you elaborate, maybe?

What do you need elaborated?

Also, as I'm just getting started testing, I guess it's good to know now: Is it okay to use Shoulda and factory_girl_rails to handle all my testing? Or is rspec / cucumber absolutely necessary? (I don't feel like changing .... but I guess I need to know)

Use RSpec (or Shoulda) to test your models. Use Cucumber to test user-facing behavior (don't bother with controller specs). Use Factory Girl everywhere (Pickle helps it talk to Cucumber).

Best,

Alright. Here's one roadblock. So what I understand w/BDD is that I should write all these tests, watch them fail, and then code to make the tests pass. But the error messages I get from running tests don't provide as much insight as doing "rails server" and then seeing whatever error comes up... I don't understand how people do this.

Also, what's becoming REALLY bothersome (I must not full understand or something) is that my tests keep failing, but testing things with rails server works fine! :(((

Please quote when replying.

daze wrote in post #970694:

Alright. Here's one roadblock. So what I understand w/BDD is that I should write all these tests, watch them fail, and then code to make the tests pass.

No. Write *one* test, watch it fail, make it pass, refactor as necessary. Then write the next test. Lather, rinse, repeat.

But the error messages I get from running tests don't provide as much insight as doing "rails server" and then seeing whatever error comes up... I don't understand how people do this.

Probably by writing more atomic tests. Could you give an example test that wasn't as useful as you would have liked?

Best,

daze wrote in post #970696:

Also, what's becoming REALLY bothersome (I must not full understand or something) is that my tests keep failing, but testing things with rails server works fine! :(((

Then you're not testing the right things. Again, code would be helpful.

Best,

daze wrote in post #970694:

> Alright. Here's one roadblock. > So what I understand w/BDD is that I should write all these tests, > watch them fail, and then code to make the tests pass.

No. Write *one* test, watch it fail, make it pass, refactor as necessary. Then write the next test. Lather, rinse, repeat.

Does this apply to all tests - unit, functional, etc? I got my unit tests working, but my functionals are not.

> But the error > messages I get from running tests don't provide as much insight as > doing "rails server" and then seeing whatever error comes up... I > don't understand how people do this.

Probably by writing more atomic tests. Could you give an example test that wasn't as useful as you would have liked?

Sure. Navigating to a sections#show page yields a screen that says "NoMethodError in SectionsController#show undefined method `paginate' for #<Class:0x5eb4ad0>" so I immediately realize I need to check wherever I call paginate and see if the method is implemented.

Running the functional test ruby -I test test/functional/sections_controller_test.rb Only yields this:   1) Error: test: A section should respond with 200. (SectionsControllerTest): NoMethodError: undefined method `response_code' for nil:NilClass

This doesn't mean anything to me. (In my test, I had should respond_with :success.)

daze wrote in post #970699:

daze wrote in post #970694:

> Alright. Here's one roadblock. > So what I understand w/BDD is that I should write all these tests, > watch them fail, and then code to make the tests pass.

No. Write *one* test, watch it fail, make it pass, refactor as necessary. Then write the next test. Lather, rinse, repeat.

Does this apply to all tests - unit, functional, etc? I got my unit tests working, but my functionals are not.

Yes. One test at a time on each level. Also, Test::Unit functionals are needlessly painful. Use Cucumber instead.

My usual procedure: Write a Cucumber story for functionality, watch it fail. Figure out the first thing I need to do to implement that functionality, write a unit spec in RSpec, watch it fail, make it pass. Do next unit spec likewise. When Cucumber story passes, feature is complete. Write another story.

> But the error > messages I get from running tests don't provide as much insight as > doing "rails server" and then seeing whatever error comes up... I > don't understand how people do this.

Probably by writing more atomic tests. Could you give an example test that wasn't as useful as you would have liked?

Sure. Navigating to a sections#show page yields a screen that says "NoMethodError in SectionsController#show undefined method `paginate' for #<Class:0x5eb4ad0>" so I immediately realize I need to check wherever I call paginate and see if the method is implemented.

Running the functional test ruby -I test test/functional/sections_controller_test.rb Only yields this:   1) Error: test: A section should respond with 200.

"A section"? Which one? Make your descriptions more explicit.

(SectionsControllerTest): NoMethodError: undefined method `response_code' for nil:NilClass

This doesn't mean anything to me.

How can that not mean anything to you, when it's telling you exactly what the error is?

(In my test, I had should respond_with :success.)

You can step through with the debugger to see where it fails.

Also, RSpec and Cucumber have better error reporting than Test::Unit.

Best,

>> > Alright. Here's one roadblock. >> > So what I understand w/BDD is that I should write all these tests, >> > watch them fail, and then code to make the tests pass.

>> No. Write *one* test, watch it fail, make it pass, refactor as >> necessary. Then write the next test. Lather, rinse, repeat.

> Does this apply to all tests - unit, functional, etc? I got my unit > tests working, but my functionals are not.

Yes. One test at a time on each level. Also, Test::Unit functionals are needlessly painful. Use Cucumber instead.

Okay. Shoulda / Test::Unit in functional tests are painful... I'll get back to you on Cucumber.

My usual procedure: Write a Cucumber story for functionality, watch it fail. Figure out the first thing I need to do to implement that functionality, write a unit spec in RSpec, watch it fail, make it pass. Do next unit spec likewise. When Cucumber story passes, feature is complete. Write another story.

Instead of RSpec, is it okay to use Shoulda (with Cucumber, I mean)? All I see, including in the Rails 3 installation instructions here... https://github.com/aslakhellesoy/cucumber-rails/blob/master/README.rdoc ... are instructions involving RSpec only. :confused: Bleh.

Should I get acquainted with RSpec? Actually, can't Shoulda and RSpec work together? There's got to be some down-to-earth tutorial about all this...

>> > But the error >> > messages I get from running tests don't provide as much insight as >> > doing "rails server" and then seeing whatever error comes up... I >> > don't understand how people do this.

>> Probably by writing more atomic tests. Could you give an example test >> that wasn't as useful as you would have liked?

> Sure. Navigating to a sections#show page yields a screen that says > "NoMethodError in SectionsController#show > undefined method `paginate' for #<Class:0x5eb4ad0>" > so I immediately realize I need to check wherever I call paginate and > see if the method is implemented.

> Running the functional test > ruby -I test test/functional/sections_controller_test.rb > Only yields this: > 1) Error: > test: A section should respond with 200.

"A section"? Which one? Make your descriptions more explicit.

> (SectionsControllerTest): > NoMethodError: undefined method `response_code' for nil:NilClass

> This doesn't mean anything to me.

How can that not mean anything to you, when it's telling you exactly what the error is?

All this error tells me is that something that is nil is trying to call response_code. The error I get with rails server and browsing to the page is undefined method `paginate' for #<Class:0x5eb4ad0>" which tells me that I have to check out the paginate method - something much more direct/useful!!!

> (In my test, I had should > respond_with :success.)

You can step through with the debugger to see where it fails.

Also, RSpec and Cucumber have better error reporting than Test::Unit.

ohhh I hope so.

So from here, I'll try to get Cucumber working for my functional tests... Is cucumber ONLY for functionals, or integration/others too? I have shoulda working for unit tests...

daze wrote in post #970823: [...]

My usual procedure: Write a Cucumber story for functionality, watch it fail. Figure out the first thing I need to do to implement that functionality, write a unit spec in RSpec, watch it fail, make it pass. Do next unit spec likewise. When Cucumber story passes, feature is complete. Write another story.

Instead of RSpec, is it okay to use Shoulda (with Cucumber, I mean)?

Probably -- if that will even work. I don't know. Cucumber grew out of RSpec, so I don't know how well it works with other test frameworks. Why don't you check the docs?

All I see, including in the Rails 3 installation instructions here... https://github.com/aslakhellesoy/cucumber-rails/blob/master/README.rdoc ... are instructions involving RSpec only. :confused: Bleh.

Bleh? What have you got against RSpec.

Should I get acquainted with RSpec?

Yes.

Actually, can't Shoulda and RSpec work together?

I think so. But I don't use Shoulda.

There's got to be some down-to-earth tutorial about all this...

> undefined method `paginate' for #<Class:0x5eb4ad0>"

> (SectionsControllerTest): > NoMethodError: undefined method `response_code' for nil:NilClass

> This doesn't mean anything to me.

How can that not mean anything to you, when it's telling you exactly what the error is?

All this error tells me is that something that is nil is trying to call response_code.

Exactly! So where are you calling response_code ? Find out why you've got a nil object there.

The error I get with rails server and browsing to the page is undefined method `paginate' for #<Class:0x5eb4ad0>" which tells me that I have to check out the paginate method - something much more direct/useful!!!

There you go, then.

> (In my test, I had should > respond_with :success.)

You can step through with the debugger to see where it fails.

Also, RSpec and Cucumber have better error reporting than Test::Unit.

ohhh I hope so.

So from here, I'll try to get Cucumber working for my functional tests... Is cucumber ONLY for functionals, or integration/others too?

Cucumber stories tend to cover the same ground as functional and integration tests. Again, read the docs.

I have shoulda working for unit tests...

Best,

> All I see, including in the Rails 3 installation instructions here... > https://github.com/aslakhellesoy/cucumber-rails/blob/master/README.rdoc > ... are instructions involving RSpec only. :confused: Bleh.

Bleh? What have you got against RSpec.

...

> Should I get acquainted with RSpec? Yes.

haha I guess I'll have to get acquainted with it...

>> > undefined method `paginate' for #<Class:0x5eb4ad0>"

>> > (SectionsControllerTest): >> > NoMethodError: undefined method `response_code' for nil:NilClass

>> > This doesn't mean anything to me.

>> How can that not mean anything to you, when it's telling you exactly >> what the error is?

> All this error tells me is that something that is nil is trying to > call response_code.

Exactly! So where are you calling response_code ? Find out why you've got a nil object there.

> The error I get with rails server and browsing to > the page is > undefined method `paginate' for #<Class:0x5eb4ad0>" which tells me > that I have to check out the paginate method - something much more > direct/useful!!!

There you go, then.

Thing is, nowhere in my application is there a call of response_code! The error lies in the paginate method - an error revealed by browsing after doing rails server, NOT by testing! If testing had told me the paginate method was undefined, I would be satisfied.

In any case.. the better error reporting in cucumber/rspec will hopefully quell these concerns.

I'll get back to you on how the rspec + cucumber works out. I've been reading the background of cucumber and I'll get them installed/running soon.... hopefully.

I came across this though: webrat or capybara? I'm not sure which. Either seems fine? I think I'll just choose webrat...?

daze wrote in post #970911: [...]

Thing is, nowhere in my application is there a call of response_code! The error lies in the paginate method - an error revealed by browsing after doing rails server, NOT by testing! If testing had told me the paginate method was undefined, I would be satisfied.

Was there a stack trace?

In any case.. the better error reporting in cucumber/rspec will hopefully quell these concerns.

I would think so.

I'll get back to you on how the rspec + cucumber works out. I've been reading the background of cucumber and I'll get them installed/running soon.... hopefully.

I came across this though: webrat or capybara? I'm not sure which. Either seems fine? I think I'll just choose webrat...?

I'm not sure. I've been using Webrat since before Capybara existed. I think Capybara is supposed to have some advantages over Webrat (including better JavaScript integration, maybe?), so I might try it on my next project. Do your research and pick.

Best,

Okay... Cucumber is not something you pick up in a day, is it? What's the learning curve - as in, how long do you estimate it will take before I get the hang of this? I'm determined to master it... BDD definitely seems like the way to go.

daze wrote in post #971002:

> I'll get back to you on how the rspec + cucumber works out. I've been > reading the background of cucumber and I'll get them installed/running > soon.... hopefully.

[...]

Okay... Cucumber is not something you pick up in a day, is it?

Probably not. For some people, though, it could be.

What's the learning curve - as in, how long do you estimate it will take before I get the hang of this?

I don't know how your mind works. If you're working with it daily, I'd probably estimate 1-2 weeks. Let us know how it goes.

I'm determined to master it... BDD definitely seems like the way to go.

I think it is!

Best,

Can I chip in here as a slight aside - after Marnen (or someone else on here) "tore a strip off me" after I asked about cucumber without really doing the groundwork myself I went off and tried it in my app (sorry about the initial lack of effort and thanks for the kick up the arse).

Anyway to cut a long story short - it's brilliant, I was up and running in no time and generated massive test coverage easily, lots of docs/tuts out there on the wires.

Yes I know that I need to be BDD eventually but for now I have test coverage that I control and can implement new tests easily. Anyway - I love it. Long live cucumber.

bingo bob wrote in post #971015:

Can I chip in here as a slight aside - after Marnen (or someone else on here) "tore a strip off me" after I asked about cucumber without really doing the groundwork myself I went off and tried it in my app (sorry about the initial lack of effort and thanks for the kick up the arse).

Anyway to cut a long story short - it's brilliant, I was up and running in no time and generated massive test coverage easily, lots of docs/tuts out there on the wires.

:slight_smile:

Yes I know that I need to be BDD eventually but for now I have test coverage that I control and can implement new tests easily.

You've been saying this for months. Stop procrastinating and do it.

Anyway - I love it. Long live cucumber.

Best,

Hey, I'm hoping that going through this rspec book is a good idea?