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