Log in

A tip for Rails and RSpec - Marnen Laibow-Koser's Journal [entries|archive|friends|userinfo]
Marnen Laibow-Koser

[ website | My Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

A tip for Rails and RSpec [Mar. 28th, 2008|02:26 pm]
Marnen Laibow-Koser
[Tags|, , , ]

This probably won't be of interest to anyone who isn't a Ruby on Rails developer, but since it seems that the thing to do in the Rails community is share tips in blog posts, I thought I might as well jump on the bandwagon.

content_for is a great method to use in Rails views, but I found it hard to test in RSpec -- I couldn't mock the right object to test for the method call, and I couldn't figure out how to get the content variable out of the response. Then I stumbled on RSpec patch 12701, which was incorporated into RSpec releases some time ago (it's in 1.1.3, certainly, and I don't know how far back it goes). It seems that while response can be tested for the main body of the response, anything defined with content_for is available as if it were a hash element. So if your view looks like:

<% content_for :sidebar do %>
  <p>Here's my sidebar text.</p>
<% end %>

<p>And here's my main content.</p>
then you can write a spec that looks something like
describe "my view" do
  before(:each) do
    render 'myview'

  it "should populate the body content" do
    response.should have_tag("p", /main content/)

  it "should populate the sidebar" do
    response[:sidebar].should have_tag("p", /sidebar/)
I just went through an hour or two of pain before stumbling on this, so I thought I'd save everyone else some trouble.


(Deleted comment)
[User Picture]From: marnen
2008-03-28 10:01 pm (UTC)
Well, as you might have seen from the first paragraph, this is a tip regarding Ruby on Rails development.

I don't think I'll be around the weekend of 12 April (I'll probably be at Æthelmearc coronation, since I know the princess's father and have met the princess herself once or twice). But I'd be happy to talk about your fiddle some other time...
(Reply) (Parent) (Thread)
(Deleted comment)