[rspec-users] spec'ing view render partial collection, local variable not found

Andrew WC Brown omen.king at gmail.com
Fri Oct 5 21:11:12 EDT 2007


I outputted name and enabled to see if it the mock object was working.

before do
  game = mock_model(Game, :name => 'The Battle for Blaze', :enabled =>
'true')
  puts game.name
  puts game.enabled
  game.should_receive(:name).and_return('The Battle for Blaze')
  game.should_receive(:enabled).and_return('true')

  @game = game
end

I still got the error but I saw in the print out 'The Battle for Blaze' and
'True'
So I for some reason thought that if I write unknowingly in my partial

<%= h game.enabled %> it might pass and it did.


I was thinking that game.should_recieve was test that the mock model being
made received Battle for the Blaze like I was confirming that the the model
was correct.

But then I looked at the code and really thought about it and realized that
what it was saying that the Game model was expecting name to be called at
some point during that spec and since it hadn't been in the partial such as
game.name then it would fail.

When I'm working with RSpec I sometimes forget what actually is going on and
I interpret how things are happening in a different way.

For that pragmatic book will it cover things such as:

how to spec a rendered template
how to spec a rendered partial
how to spec a rendered partial collection
how to spec a cookie
...

or will it be more of a guide like the RSpec Peepcode videos but in book
format with more elaboration.
I don't think I would have ever spec'd view if I hadn't started using story
runner.

I love that story runner.

On 10/5/07, David Chelimsky <dchelimsky at gmail.com> wrote:
>
> I meant the view code as well.
>
> On 10/5/07, Andrew WC Brown <omen.king at gmail.com> wrote:
> > As soon as I add a second key to the hash it gives me that error
> >
> > before do
> >   game = mock_model(Game, :name => 'The Battle for Blaze', :enabled =>
> > 'true')
> >   game.should_receive(:name).and_return('The Battle for Blaze')
> >   game.should_receive(:enabled).and_return('true')
> >
> >   @game = game
> > end
> >
> > 1)
> > Spec::Mocks::MockExpectationError in '/games/_game.rhtml
> > should show game name'
> > Mock 'Game_1082' expected :enabled with (any args) once, but received it
> 0
> > times
> > ./spec/views/games/_game.rhtml_spec.rb:19:
> >
> > But if it only has name it works fine.
> >
> > ?!??! I have other mock models setup that don't give me that trouble.
> >
> >
> >
> > On 10/5/07, Andrew WC Brown <omen.king at gmail.com> wrote:
> > > _game.rhtml_spec
> > >
> > > require File.dirname(__FILE__) + '/../../spec_helper'
> > >
> > > describe "/games/_game.rhtml" do
> > >   include GamesHelper
> > >
> > >   before do
> > >     game = mock_model(Game,
> > >       :name => 'The Battle for Blaze',
> > >       :salt_grains => 5000000,
> > >       :people => 5000000,
> > >       :days => nil,
> > >       :created_at => "Mon Oct 01 00:02:44 -0400 2007",
> > >       :enabled => true)
> > >     game.should_receive (:name).and_return('The Battle for Blaze')
> > >     game.should_receive(:salt_grains).and_return(5000000)
> > >     game.should_receive(:people).and_return(5000000)
> > >     game.should_receive(:days).and_return(nil)
> > >     game.should_receive(:created_at).and_return("Mon Oct 01 00:02:44
> -0400
> > 2007")
> > >     game.should_receive(:enabled).and_return(true)
> > >
> > >     @game = game
> > >   end
> > >
> > >   it "should show game name" do
> > >     render :partial =>"games/game", :locals => {:game => @game}
> > >     response.should have_text(/The Battle for Blaze/)
> > >   end
> > >
> > > end
> > >
> > > When you say full listing did you mean html format?
> > > I cut out most of my specs just to spec the partial.
> > > I only have the one spec in my partial
> > >
> > >
> > >
> > >
> > >
> > > On 10/5/07, David Chelimsky < dchelimsky at gmail.com> wrote:
> > > > On 10/5/07, Andrew WC Brown < omen.king at gmail.com> wrote:
> > > > > Well I think my biggest problem I was having was the fact that my
> > before
> > > > > block was:
> > > > >
> > > > >  def before
> > > > >  end
> > > > >
> > > > >  instead of
> > > > >
> > > > >  before do
> > > > >  end
> > > >
> > > > D'oh - can't believe I missed that.
> > > >
> > > > >
> > > > > So I think its working, although my mock is complaining now:
> > > > > before do
> > > > >     game = mock_model(Game,
> > > > >       :name => 'The Battle for Blaze',
> > > > >       :salt_grains => 5000000,
> > > > >       :people => 5000000,
> > > > >       :days => nil,
> > > > >       :created_at => "Mon Oct 01 00:02:44 -0400 2007",
> > > > >       :enabled => true)
> > > > >     game.should_receive(:name).and_return('The Battle for Blaze')
> > > > >     game.should_receive
> > (:salt_grains).and_return(5000000)
> > > > >     game.should_receive(:people).and_return(5000000)
> > > > >     game.should_receive(:days).and_return(nil)
> > > > >     game.should_receive(:created_at).and_return("Mon Oct 01
> 00:02:44
> > -0400
> > > > > 2007")
> > > > >     game.should_receive(:enabled).and_return(true)
> > > > >     @game = game
> > > > > end
> > > > >
> > > > > 1)
> > > > > Spec::Mocks::MockExpectationError in
> > '/games/_game.rhtml
> > > > > should show game name'
> > > > > Mock 'Game_1082' expected :salt_grains with (any args) once, but
> > received it
> > > > > 0 times
> > > > > ./spec/views/games/_game.rhtml_spec.rb:15:
> > > >
> > > > I'd need to see the full listing of both spec and code as they are
> now
> > > > to help you w/ that.
> > > >
> > > > >
> > > > >
> > > > > On 10/5/07, David Chelimsky < dchelimsky at gmail.com> wrote:
> > > > > > On 10/5/07, Andrew WC Brown < omen.king at gmail.com > wrote:
> > > > > > > Well when I saw that originally thats what I thought the
> response
> > was
> > > > > > > suppose to come after the render but:
> > > > > > >
> > > > > > > ActionView::ActionViewError in '/games/_game.rhtml should show
> > game
> > > > > name'
> > > > > > > No rhtml, rxml, rjs or delegate template found for //_game in
> > > > > > >
> > /Volumes/EXTERNAL/web/omenking.ca/config/../app/views
> > > > > > >
> > > > > > > games/_game.rhtml does exist.
> > > > > > >
> > > > > > > which maybe I have to state:
> > > > > > >
> > > > > > >   it "should show game name" do
> > > > > > >     render :partial =>"games/game", :collection => @games
> > > > > > >     response.should have_text(/The Battle for Blaze/)
> > > > > > >   end
> > > > > > >
> > > > > > > but then:
> > > > > > >
> > > > > > > 1)
> > > > > > > ActionView::TemplateError in '/games/_game.rhtml should show
> game
> > name'
> > > > > > > You have a nil object when you didn't expect it!
> > > > > > > The error occurred while evaluating nil.name
> > > > > > > On line #1 of app/views/games/_game.rhtml
> > > > > > >
> > > > > > >     1: <%= h game.name %>
> > > > > > >
> > > > > > > so the local variable is show up nil.
> > > > > >
> > > > > > :collection is something rails uses to render a template
> multiple
> > > > > > times. RSpec only renders the file once (as intended). Try using
> > > > > > :object:
> > > > > >
> > > > > > render :partial =>"games/game", :object => @game
> > > > > >
> > > > > > (of course, you'll have to have setup @game).
> > > > > >
> > > > > > >
> > > > > > >
> > > > > > >  On 10/5/07, David Chelimsky <dchelimsky at gmail.com> wrote:
> > > > > > > >
> > > > > > > > On 10/5/07, Andrew WC Brown < omen.king at gmail.com> wrote:
> > > > > > > > > 1)
> > > > > > > > > '/games/_game.rhtml should show game name' FAILED
> > > > > > > > > expected /The Battle for Blaze/, got ""
> > > > > > > > > ./spec/views/games/_game.rhtml_spec.rb:39:
> > > > > > > > >
> > > > > > > > >   def before
> > > > > > > > >     game_1 = mock_model(Game,
> > > > > > > > >       :name => 'The Battle for Blaze',
> > > > > > > > >       :salt_grains => 5000000,
> > > > > > > > >       :people => 5000000,
> > > > > > > > >       :days => nil,
> > > > > > > > >       :created_at => "Mon Oct 01 00:02:44 -0400 2007",
> > > > > > > > >       :enabled => true)
> > > > > > > > >
> > game_1.should_receive(:name).and_return("The
> > > > > Battle
> > > > > > > for
> > > > > > > > > Blaze")
> > > > > > > > >
> > > > > > >
> > game_1.should_receive(:salt_grains).and_return(5000000)
> > > > > > > > >
> > > > > game_1.should_receive(:people).and_return(5000000)
> > > > > > > > >
> > game_1.should_receive(:days).and_return(nil)
> > > > > > > > >
> > > > > game_1.should_receive(:created_at).and_return("Mon
> > > > > > > Oct
> > > > > > > > > 01 00:02:44 -0400 2007")
> > > > > > > > >
> > > > > game_1.should_receive(:enabled).and_return(true)
> > > > > > > > >
> > > > > > > > >     game_2 = mock_model(Game,
> > > > > > > > >       :name => 'Epicbattlegrounds',
> > > > > > > > >       :salt_grains => 30000000,
> > > > > > > > >       :people => 20000000,
> > > > > > > > >       :days => 100,
> > > > > > > > >       :created_at => "Mon Sept 01 12:02:44 -0400 2007",
> > > > > > > > >       :enabled => false)
> > > > > > > > >
> > > > > > > > >
> > > > > > >
> > > > >
> > game_2.should_receive(:name).and_return("Epicbattlegrounds")
> > > > > > > > >
> > > > > > > > >
> > > > > > >
> > > > >
> > game_2.should_receive(:salt_grains).and_return(30000000)
> > > > > > > > >
> > > > > game_2.should_receive(:people).and_return(20000000)
> > > > > > > > >
> > game_2.should_receive(:days).and_return(100)
> > > > > > > > >
> > > > > game_2.should_receive(:created_at).and_return("Mon
> > > > > > > Sept
> > > > > > > > > 01 12:02:44 -0400 2007")
> > > > > > > > >
> > > > > game_2.should_receive(:enabled).and_return(false)
> > > > > > > > >     @games = [game_1, game_2]
> > > > > > > > >     assigns[:games] = [game_1, game_2]
> > > > > > > > >   end
> > > > > > > > >
> > > > > > > > >   it "should show game name" do
> > > > > > > > >     response.should have_text(/The Battle for Blaze/)
> > > > > > > > >     render :partial =>"game", :collection => @games
> > > > > > > >
> > > > > > > > Switch these around:
> > > > > > > >
> > > > > > > > render :partial =>"game", :collection => @games
> > > > > > > > response.should have_text(/The Battle for Blaze/)
> > > > > > > >
> > > > > > > >
> > > > > > > > >   end
> > > > > > > > >
> > > > > > > > > I think the local variable is showing up nil because my
> specs
> > in the
> > > > > > > > > index.rhtml were failing when they were fine before and
> they
> > were
> > > > > saying
> > > > > > > > > they didn't know what this game variable was.
> > > > > > > > >
> > > > > > > > > Any ideas?
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > On 10/5/07, David Chelimsky < dchelimsky at gmail.com> wrote:
> > > > > > > > > > On 10/5/07, Andrew WC Brown < omen.king at gmail.com>
> wrote:
> > > > > > > > > > > I'm trying to spec out a render partial collection but
> I
> > get the
> > > > > > > > > following
> > > > > > > > > > > error
> > > > > > > > > > >
> > > > > > > > > > > 2)
> > > > > > > > > > > NoMethodError in '/games/_game.rhtml should show game
> > name'
> > > > > > > > > > > undefined method `body' for
> > #<#<Class:0x316580c>:0x2f1154c>
> > > > > > > > > > >
> > > > > > > > >
> > > > > > >
> > > > >
> >
> /Volumes/EXTERNAL/web/omenking.ca/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/have_text.rb:12:in
> > > > > > > > > > > `matches?'
> > > > > > > > > > >
> > ./spec/views/games/_game.rhtml_spec.rb:39:
> > > > > > > > > > >
> > > > > > > > > > >   def before
> > > > > > > > > > >     game = mock_model(Game,
> > > > > > > > > > >       :name => 'The Battle for Blaze',
> > > > > > > > > > >       :salt_grains => 5000000,
> > > > > > > > > > >       :people => 5000000,
> > > > > > > > > > >       :days => nil,
> > > > > > > > > > >       :created_at => "Mon Oct 01 00:02:44 -0400 2007",
> > > > > > > > > > >        :enabled => true)
> > > > > > > > > > >     game.should_receive(:name).and_return("The Battle
> for
> > > > > Blaze")
> > > > > > > > > > >
> > > > > > > > >
> > > > > game.should_receive(:salt_grains).and_return(5000000)
> > > > > > > > > > >     game.should_receive(:people).and_return(5000000)
> > > > > > > > > > >     game.should_receive (:days).and_return(nil)
> > > > > > > > > > >     game.should_receive(:created_at).and_return("Mon
> Oct
> > 01
> > > > > 00:02:44
> > > > > > > > > -0400
> > > > > > > > > > > 2007")
> > > > > > > > > > >     game.should_receive(:enabled).and_return(true)
> > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > > >     assigns[:games] = [game]
> > > > > > > > > > >   end
> > > > > > > > > > >
> > > > > > > > > > >   it "should show game name" do
> > > > > > > > > > >     template.should have_text(/The Battle for Blaze/)
> > > > > > > > > >
> > > > > > > > > > response.should have_text ....
> > > > > > > > > >
> > > > > > > > > > (not template.should ...)
> > > > > > > > > >
> > > > > > > > > > >     render :partial =>"game", :collection => @games
> > > > > > > > > > >   end
> > > > > > > > > > >
> > > > > > > > > > >
> > _______________________________________________
> > > > > > > > > > > rspec-users mailing list
> > > > > > > > > > > rspec-users at rubyforge.org
> > > > > > > > > > >
> > > > > http://rubyforge.org/mailman/listinfo/rspec-users
> > > > > > > > > > >
> > > > > > > > > >
> > _______________________________________________
> > > > > > > > > > rspec-users mailing list
> > > > > > > > > > rspec-users at rubyforge.org
> > > > > > > > > >
> > http://rubyforge.org/mailman/listinfo/rspec-users
> > > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > _______________________________________________
> > > > > > > > > rspec-users mailing list
> > > > > > > > > rspec-users at rubyforge.org
> > > > > > > > >
> > http://rubyforge.org/mailman/listinfo/rspec-users
> > > > > > > > >
> > > > > > > > _______________________________________________
> > > > > > > > rspec-users mailing list
> > > > > > > > rspec-users at rubyforge.org
> > > > > > > >
> > http://rubyforge.org/mailman/listinfo/rspec-users
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > _______________________________________________
> > > > > > > rspec-users mailing list
> > > > > > > rspec-users at rubyforge.org
> > > > > > > http://rubyforge.org/mailman/listinfo/rspec-users
> > > > > > >
> > > > > > _______________________________________________
> > > > > > rspec-users mailing list
> > > > > > rspec-users at rubyforge.org
> > > > > > http://rubyforge.org/mailman/listinfo/rspec-users
> > > > > >
> > > > >
> > > > >
> > > > >
> > > > > _______________________________________________
> > > > > rspec-users mailing list
> > > > > rspec-users at rubyforge.org
> > > > > http://rubyforge.org/mailman/listinfo/rspec-users
> > > > >
> > > > _______________________________________________
> > > > rspec-users mailing list
> > > > rspec-users at rubyforge.org
> > > > http://rubyforge.org/mailman/listinfo/rspec-users
> > > >
> > >
> > >
> > >
> > > --
> > > Monsterbox Productions
> > > putting small businesses on-line
> > >
> > > 1319 Victoria Avenue East
> > > Thunder Bay, Ontario P7C 1C3
> > > Canada
> > >
> > > Andrew WC Brown
> > > web-developer and owner
> > > andrew at monsterboxpro.com
> > > P: 807-626-9009
> > > F: 807-624-2705
> >
> >
> >
> > --
> > Monsterbox Productions
> > putting small businesses on-line
> >
> > 1319 Victoria Avenue East
> > Thunder Bay, Ontario P7C 1C3
> > Canada
> >
> > Andrew WC Brown
> > web-developer and owner
> > andrew at monsterboxpro.com
> > P: 807-626-9009
> > F: 807-624-2705
> > _______________________________________________
> > rspec-users mailing list
> > rspec-users at rubyforge.org
> > http://rubyforge.org/mailman/listinfo/rspec-users
> >
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>



-- 
Monsterbox Productions
putting small businesses on-line

1319 Victoria Avenue East
Thunder Bay, Ontario P7C 1C3
Canada

Andrew WC Brown
web-developer and owner
andrew at monsterboxpro.com
P: 807-626-9009
F: 807-624-2705
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://rubyforge.org/pipermail/rspec-users/attachments/20071005/0c5aeeff/attachment-0001.html 


More information about the rspec-users mailing list