Spec'ing view render partial collection, local variable not found

I’m trying to spec out a render partial collection but I get the
following
error

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:inmatches?’
./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/)
render :partial =>“game”, :collection => @games
end

On 10/5/07, Andrew WC Brown [email protected] wrote:

def before
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 …)

‘/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
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, Andrew WC Brown [email protected] wrote:

  :days => nil,

game_2.should_receive(:salt_grains).and_return(30000000)
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/)

On 10/5/07, Andrew WC Brown [email protected] wrote:

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 C. [email protected] wrote:

which maybe I have to state:
You have a nil object when you didn’t expect it!

render :partial =>“games/game”, :object => @game

(of course, you’ll have to have setup @game).

That do the trick?

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:

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.

On 10/5/07, Andrew WC Brown [email protected] 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.

game.should_receive(:name).and_return('The Battle for Blaze')

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.

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

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

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:

_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 C. [email protected] wrote:

before do
:people => 5000000,
game.should_receive(:enabled).and_return(true)

render :partial =>"games/game", :collection => @games

On line #1 of app/views/games/_game.rhtml

./spec/views/games/_game.rhtml_spec.rb:39:
Battle
01 00:02:44 -0400 2007")

response.should have_text(/The Battle for Blaze/)

I think the local variable is showing up nil because my specs in

On 10/5/07, Andrew WC Brown < [email protected]> wrote:

  :days => nil,

00:02:44

[email protected]
rspec-users mailing list


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


Monsterbox Productions
putting small businesses on-line

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

Andrew WC Brown
web-developer and owner
[email protected]
P: 807-626-9009
F: 807-624-2705

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

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 [email protected] wrote:

  :name => 'The Battle for Blaze',

2007")
end

Well I think my biggest problem I was having was the fact that my

  :created_at => "Mon Oct 01 00:02:44 -0400 2007",

end
to help you w/ that.
game

response.should have_text(/The Battle for Blaze/)

(of course, you’ll have to have setup @game).

for

game_2.should_receive(:created_at).and_return("Mon

render :partial =>"game", :collection => @games

in the

I’m trying to spec out a render partial collection but I

  :salt_grains => 5000000,
game.should_receive (:days).and_return(nil)

[email protected]
Thunder Bay, Ontario P7C 1C3
Canada

Andrew WC Brown
web-developer and owner
[email protected]
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
[email protected]
P: 807-626-9009
F: 807-624-2705

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.

I meant the view code as well.

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 C. [email protected] wrote:

game.should_receive(:enabled).and_return(‘true’)
./spec/views/games/_game.rhtml_spec.rb:19:

require File.dirname(FILE) + ‘/…/…/spec_helper’
:created_at => “Mon Oct 01 00:02:44 -0400 2007”,
@game = game
I cut out most of my specs just to spec the partial.

block was:

game.should_receive(:name).and_return('The Battle for Blaze')

end
I’d need to see the full listing of both spec and code as they are

suppose to come after the render but:
which maybe I have to state:
game
multiple

  :people => 5000000,

game_1.should_receive(:salt_grains).and_return(5000000)

response.should have_text(/The Battle for Blaze/)

I think the local variable is showing up nil because my

NoMethodError in '/games/_game.rhtml should show game

game.should_receive(:name).and_return("The Battle

00:02:44

[email protected]

rspec-users mailing list

putting small businesses on-line

Andrew WC Brown
rspec-users mailing list
[email protected]
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
[email protected]
P: 807-626-9009
F: 807-624-2705