I''m setting the status code on a controller action but rspec
doesn''t
seem to be catching it in my spec. It works in the browser.
This is the controller method, called via xhr with header Accept:
''application/json''
def validate
account = Account.new(:login => params[:login])
account.valid?
unless (errors = account.errors[''login''])
url = [''http:'','''', request.host,
params[:login]].join(''/'')
respond_to do |format|
format.json { render :json => { :url => url } }
end
else
url = [''http:'','''',
request.host].join(''/'')
respond_to do |format|
format.json { render :json => {:errors => errors, :url =>
url }, :status => 409}
end
end
end
And the spec;
describe "with errors on login" do
before do
@account.stub!(:errors).and_return( {
"password_confirmation"=>["can''t be
blank"],
"login"=>["is too short (minimum is 3
characters)", "use
only letters, numbers, and .-_@ please."],
"password"=>["can''t be blank",
"is too short (minimum is 6
characters)"],
"email"=>["can''t be blank", "is
too short (minimum is 6
characters)", "should look like an email address."]
} )
request.env["HTTP_HOST"] = "myhost"
controller.use_rails_error_handling!
end
it "should return conflict 409" do
do_post
response.response_code.should == 409
end
it "should only return the login errors & the url" do
expected_json = {
"login" => ["is too short (minimum is 3
characters)", "use
only letters, numbers, and .-_@ please."],
''url'' => ''myhost/mylogin''
}.to_json
@format.should_receive(:json).and_return(expected_json)
do_post
end
end
Any ideas?
Pat Maddox
2008-Aug-03 20:19 UTC
[rspec-users] Rspec doesn''t pickup the status code correctly.
> it "should return conflict 409" do > do_post > response.response_code.should == 409 > endWhat is the failure message? Also, it looks like your before block has not set Account.new to return @account, and that @account is nil. Is this a nested describe, and there''s some other setup happening elsewhere? Pat
It is nested and the rest of the setup is here;
before(:each) do
request.env["HTTP_ACCEPT"] = "application/json"
@account = mock_account
@account.stub!(:valid?)
Account.stub!(:new).and_return(@account)
@errors = { ''login'' => ''Not available, try
another!'' }
@account.stub!(:errors).and_return( @errors )
@json = {:this => ''that''}.to_json
@format = mock("format", :json => @json )
controller.stub!(:respond_to).and_yield(@format)
end
All the other specs pass the only failure is this being
should return conflict 409
expected: 409,
got: 200 (using ==)
Thanks,
James
On Aug 3, 9:19?pm, "Pat Maddox" <perg... at gmail.com>
wrote:> > ? ? ?it "should return conflict 409" do
> > ? ? ? ?do_post
> > ? ? ? ?response.response_code.should == 409
> > ? ? ?end
>
> What is the failure message?
>
> Also, it looks like your before block has not set Account.new to
> return @account, and that @account is nil. ?Is this a nested describe,
> and there''s some other setup happening elsewhere?
>
> Pat
> _______________________________________________
> rspec-users mailing list
> rspec-us... at
rubyforge.orghttp://rubyforge.org/mailman/listinfo/rspec-users
The failure message is;
should return conflict 409
expected: 409,
got: 200 (using ==)
Yes it is nested and the rest of the setup is;
before(:each) do
request.env["HTTP_ACCEPT"] = "application/json"
@account = mock_account
@account.stub!(:valid?)
Account.stub!(:new).and_return(@account)
@errors = { ''login'' => ''Not available, try
another!'' }
@account.stub!(:errors).and_return( @errors )
@json = {:this => ''that''}.to_json
@format = mock("format", :json => @json )
controller.stub!(:respond_to).and_yield(@format)
end
Thanks.
James
On Aug 3, 9:19?pm, "Pat Maddox" <perg... at gmail.com>
wrote:> > ? ? ?it "should return conflict 409" do
> > ? ? ? ?do_post
> > ? ? ? ?response.response_code.should == 409
> > ? ? ?end
>
> What is the failure message?
>
> Also, it looks like your before block has not set Account.new to
> return @account, and that @account is nil. ?Is this a nested describe,
> and there''s some other setup happening elsewhere?
>
> Pat
> _______________________________________________
> rspec-users mailing list
> rspec-us... at
rubyforge.orghttp://rubyforge.org/mailman/listinfo/rspec-users
Steve
2008-Aug-04 04:16 UTC
[rspec-users] Rspec doesn''t pickup the status code correctly.
J2M wrote:> I''m setting the status code on a controller action but rspec doesn''t > seem to be catching it in my spec. It works in the browser. > > This is the controller method, called via xhr with header Accept: > ''application/json'' > > def validate > account = Account.new(:login => params[:login]) > account.valid? > unless (errors = account.errors[''login'']) > url = [''http:'','''', request.host, params[:login]].join(''/'') > respond_to do |format| > format.json { render :json => { :url => url } } > end > else > url = [''http:'','''', request.host].join(''/'') > respond_to do |format| > format.json { render :json => {:errors => errors, :url => > url }, :status => 409} > end > end > endI don''t know if it''s the cause, but your unless statement is an assignment, and not an equality comparison: unless (errors = account.errors[''login'']) Steve
On Aug 4, 5:16?am, Steve <vertebr... at gmail.com> wrote:> J2M wrote: > > I''m setting the status code on a controller action but rspec doesn''t > > seem to be catching it in my spec. It works in the browser. > > > This is the controller method, called via xhr with header Accept: > > ''application/json'' > > > ? def validate > > ? ? account = Account.new(:login => params[:login]) > > ? ? account.valid? > > ? ? unless (errors = account.errors[''login'']) > > ? ? ? url = [''http:'','''', request.host, params[:login]].join(''/'') > > ? ? ? respond_to do |format| > > ? ? ? ? format.json { render :json => { :url => url } } > > ? ? ? end > > ? ? else > > ? ? ? url = [''http:'','''', request.host].join(''/'') > > ? ? ? respond_to do |format| > > ? ? ? ? format.json { render :json => {:errors => errors, :url => > > url }, :status => 409} > > ? ? ? end > > ? ? end > > ? end > > I don''t know if it''s the cause, but your unless statement is an > assignment, and not an equality comparison: > > unless (errors = account.errors[''login''])That''s just me being lazy I''m assigning errors I could have put that as; errors = account.errors[''login''] if account.errors[''login''] But it isn''t the cause as it works in the wild, it is just the spec that fails. Thanks, James
I''m not having much luck posting here, every other reply seems to go astray! So if I double post sorry! I''m using Rails 2.1 Rspec 1.1.4 Any ideas why this isn''t giving the correct response in Rspec but is in the wild? On Aug 4, 4:31?pm, J2M <james2mccar... at gmail.com> wrote:> On Aug 4, 5:16?am, Steve <vertebr... at gmail.com> wrote: > > > > > J2M wrote: > > > I''m setting the status code on a controller action but rspec doesn''t > > > seem to be catching it in my spec. It works in the browser. > > > > This is the controller method, called via xhr with header Accept: > > > ''application/json'' > > > > ? def validate > > > ? ? account = Account.new(:login => params[:login]) > > > ? ? account.valid? > > > ? ? unless (errors = account.errors[''login'']) > > > ? ? ? url = [''http:'','''', request.host, params[:login]].join(''/'') > > > ? ? ? respond_to do |format| > > > ? ? ? ? format.json { render :json => { :url => url } } > > > ? ? ? end > > > ? ? else > > > ? ? ? url = [''http:'','''', request.host].join(''/'') > > > ? ? ? respond_to do |format| > > > ? ? ? ? format.json { render :json => {:errors => errors, :url => > > > url }, :status => 409} > > > ? ? ? end > > > ? ? end > > > ? end > > > I don''t know if it''s the cause, but your unless statement is an > > assignment, and not an equality comparison: > > > unless (errors = account.errors[''login'']) > > That''s just me being lazy I''m assigning errors I could have put that > as; > > errors = account.errors[''login''] if account.errors[''login''] > > But it isn''t the cause as it works in the wild, it is just the spec > that fails. > > Thanks, > James > > _______________________________________________ > rspec-users mailing list > rspec-us... at rubyforge.orghttp://rubyforge.org/mailman/listinfo/rspec-users