Just a quick question on David's new-controller-examples


#1

http://blog.davidchelimsky.net/2008/7/1/new-controller-examples

BTW … great post, thanks :slight_smile:

I was wondering the thinking of this one …

describe “responding to POST /accounts” do

describe “with failed save” do

   it "should create a new account" do
     Account.should_receive(:new).with({'these' =>

‘params’}).and_return(mock_account(:save => false))
post :create, :account => {:these => ‘params’}
end

compared to the similar example in describe “with successful save”.

The expected behaviour seems the same and I wondered why it would not
be pulled into just the responding to POST /accounts block?

Cheers
Shane

Shane M.
ELC Technologies ™
1921 State Street
Santa Barbara, CA 93101

Phone: +64 4 568 6684
Mobile: +64 21 435 586
Email: removed_email_address@domain.invalid
AIM: ShaneMingins
Skype: shane.mingins

(866) 863-7365 Tel - Santa Barbara Office
(866) 893-1902 Fax - Santa Barbara Office

+44 020 7504 1346 Tel - London Office
+44 020 7504 1347 Fax - London Office


#2

I have a different question about the article (pity comments are
closed).

def mock_account(stubs={})
stubs = {
:save => true,
:update_attributes => true,
:destroy => true,
:to_xml => ‘’
}.merge(stubs)
@mock_account ||= mock_model(Account, stubs)
end

With this helper, doesn’t @mock_account only get set once inside its
‘describe’ block? Any future tests would use the same @mock_account,
even if
other stubs were designated.

I’m probably missing something very obvious.

///ark


#3

Hi Mark

Yeah I was looking at that later on too. And yes if you use in a
‘before’ it does. Only setting in an ‘it’ block is ok.

I was using this as a quick test as we are on an older version of
rspec and I was checking if it may have changed but this fails on 1.1.8

require File.expand_path(File.dirname(FILE) + ‘/…/spec_helper’)

describe PersonController do

def mock_person(stubs={})
@person ||= mock_model(Person, stubs)
end

describe “GET” do

 before(:each) do
   mock_person(:name => "fred")
 end

 it "should have name fred" do
   @person.name.should == "fred"
 end

 it "should have name steve" do
   mock_person(:name => "steve")
   @person.name.should == "steve"
 end

end

describe “POST” do

 it "should have name steve" do
   mock_person(:name => "steve")
   @person.name.should == "steve"
 end

 it "should have name bob" do
   mock_person(:name => "bob")
   @person.name.should == "bob"
 end

end

end

‘PersonController GET should have name steve’ FAILED
expected: “steve”,
got: “fred” (using ==)
./spec/controllers/person_controller_spec.rb:21:

Finished in 0.295898 seconds

6 examples, 1 failure

On 16/10/2008, at 6:26 AM, Mark W. wrote:

}.merge(stubs)

///ark


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

Shane M.
ELC Technologies ™
1921 State Street
Santa Barbara, CA 93101

Phone: +64 4 568 6684
Mobile: +64 21 435 586
Email: removed_email_address@domain.invalid
AIM: ShaneMingins
Skype: shane.mingins

(866) 863-7365 Tel - Santa Barbara Office
(866) 893-1902 Fax - Santa Barbara Office

+44 020 7504 1346 Tel - London Office
+44 020 7504 1347 Fax - London Office


#4

On Wed, Oct 15, 2008 at 3:58 PM, Shane M. removed_email_address@domain.invalid
wrote:

describe PersonController do

end
got: “fred” (using ==)
./spec/controllers/person_controller_spec.rb:21:

Finished in 0.295898 seconds

6 examples, 1 failure

Admittedly, this is a violation of the principal of least surprise,
but your analysis of the problem is not quite accurate.

Each example is run in its own instance of the group (just like xUnit
frameworks) and has its own state. before(:each) gets run, as it says,
before each example in the context of its own instance of the group.

So what’s happening is that the mock_person(:name => “fred”) in the
before is creating the instance, whereas the mock_person(:name =>
“steve”) in the example is not actually creating a new object - it
essentially does nothing :frowning:

I think that the mock_person method probably needs to be smarter so if
it’s already been called AND it gets args it raises an error. WDYT?