HTTP Status 406 When Testing :json

Hello all,

My first question, in my controllers, do I need to test respond_to is
returning the correct data for its mime-type?

In my controller spec I have

it “creates a list of available types for that category” do
xhr :get, :index_available, :category_id => 1, :format => :json
assigns[:types].should have(1).record
end

and in my logs I see (406 Not acceptable…)

Processing TypesController#index_available to json (for 0.0.0.0 at
2011-05-02 13:20:01) [GET]
Parameters: {“category_id”=>“1”}
Completed in 1ms (View: 0, DB: 0) | 406 Not Acceptable [
http://test.host/categories/1/types/index_available.json]
SQL (0.1ms) ROLLBACK
SQL (0.0ms) BEGIN

But I get a green pass.

If I change :format => :json to ‘json’, I get a load of errors (which I
have
mentioned before on this list but haven’t had time to address the
situation)

/home/anthony/.rvm/gems/[email protected]/gems/activesupport-2.3.11/lib/active_support/json/encoders/hash.rb:37:in
each' /home/anthony/.rvm/gems/[email protected]/gems/activesupport-2.3.11/lib/active_support/json/encoders/hash.rb:37:inmap’
/home/anthony/.rvm/gems/[email protected]/gems/activesupport-2.3.11/lib/active_support/json/encoders/hash.rb:37:in
to_json' /home/anthony/.rvm/gems/[email protected]/gems/activesupport-2.3.11/lib/active_support/json/encoding.rb:79:inencode’
/home/anthony/.rvm/gems/[email protected]/gems/activesupport-2.3.11/lib/active_support/json/encoding.rb:18:in
__send__' /home/anthony/.rvm/gems/[email protected]/gems/activesupport-2.3.11/lib/active_support/json/encoding.rb:18:inencode’
/home/anthony/.rvm/gems/[email protected]/gems/activesupport-2.3.11/lib/active_support/json/encoders/object.rb:4:in
to_json' /home/anthony/.rvm/gems/[email protected]/gems/activesupport-2.3.11/lib/active_support/json/encoding.rb:79:inencode’
/home/anthony/.rvm/gems/[email protected]/gems/activesupport-2.3.11/lib/active_support/json/encoding.rb:18:in
__send__' /home/anthony/.rvm/gems/[email protected]/gems/activesupport-2.3.11/lib/active_support/json/encoding.rb:18:inencode’
/home/anthony/.rvm/gems/[email protected]/gems/activesupport-2.3.11/lib/active_support/json/encoders/enumerable.rb:11:in
to_json' /home/anthony/.rvm/gems/[email protected]/gems/activesupport-2.3.11/lib/active_support/json/encoders/enumerable.rb:11:inmap’
/home/anthony/.rvm/gems/[email protected]/gems/activesupport-2.3.11/lib/active_support/json/encoders/enumerable.rb:11:in
to_json' /home/anthony/Development/websites/ruby/GMFT/trunk/app/controllers/types_controller.rb:30:inindex_available’
/home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/mime_responds.rb:135:in
call' /home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/mime_responds.rb:135:incustom’
/home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/mime_responds.rb:179:in
call' /home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/mime_responds.rb:179:inrespond’
/home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/mime_responds.rb:173:in
each' /home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/mime_responds.rb:173:inrespond’
/home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/mime_responds.rb:107:in
respond_to' /home/anthony/Development/websites/ruby/GMFT/trunk/app/controllers/types_controller.rb:29:inindex_available’
/home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/base.rb:1333:in
send' /home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/base.rb:1333:inperform_action_without_filters’
/home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/filters.rb:617:in
call_filters' /home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/filters.rb:610:inperform_action_without_benchmark’
/home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/benchmarking.rb:68:in
perform_action_without_rescue' /home/anthony/.rvm/gems/[email protected]/gems/activesupport-2.3.11/lib/active_support/core_ext/benchmark.rb:17:inms’
/home/anthony/.rvm/gems/[email protected]/gems/activesupport-2.3.11/lib/active_support/core_ext/benchmark.rb:17:in
ms' /home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/benchmarking.rb:68:inperform_action_without_rescue’
/home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/rescue.rb:160:in
perform_action_without_flash' /home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/flash.rb:151:inperform_action’
/home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/base.rb:532:in
send' /home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/base.rb:532:inprocess_without_filters’
/home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/filters.rb:606:in
process' /home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/test_process.rb:567:inprocess_with_test’
/home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/test_process.rb:447:in
process' /home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/test_process.rb:398:inget’
/home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/test_process.rb:453:in
__send__' /home/anthony/.rvm/gems/[email protected]/gems/actionpack-2.3.11/lib/action_controller/test_process.rb:453:inxhr’
./spec/controllers/types_controller_spec.rb:34:

So, two pronged question, do I need to test :json (seeing as I’m not
testing
the contents) and can anyone shed any light on my 406 and/or the errors
when
changing the format to ‘json’

Many thanks

-ants

Hi,

When testing Rails APIs, always assert on response codes and where
relevant, the Location, Content-Type and other headers. We wound up
doing this on every single project and so extracted it into a gem that
you might find useful: https://github.com/c42/rspec-http

Best,
Sidu.
http://c42.in
http://about.me/ponnappa

By the way, asserting on the response code will only help ensure that
you don’t get green specs
even though you’re request fails with a 406 (or something similar).
You’re getting a 406
because whatever the Accepts header is on that request
(‘application/json’ I’d presume) does not have a responds_to clause
that matches it. Not sure about :json vs ‘json.’

On 2 May 2011 14:35, Sidu P. [email protected] wrote:

  assigns[:types].should have(1).record

SQL (0.0ms) BEGIN
/gems/activesupport-2.3.11/lib/active_support/json/encoders/hash.rb:37:in

/home/anthony/.rvm/gems/[email protected]
`encode’
/gems/activesupport-2.3.11/lib/active_support/json/encoders/enumerable.rb:11:in

/home/anthony/.rvm/gems/[email protected]
`each’
/gems/actionpack-2.3.11/lib/action_controller/base.rb:1333:in

/home/anthony/.rvm/gems/[email protected]
`perform_action_without_rescue’
/gems/actionpack-2.3.11/lib/action_controller/base.rb:532:in

/home/anthony/.rvm/gems/[email protected]
So, two pronged question, do I need to test :json (seeing as I’m not


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

I forgot to add my controller as I render the json inline and not in a
template. I wonder if this has a bearing?!

def index_available
@types = @category.types.available

respond_to do |format|
  format.json { render :json => @types.to_json(:only => [:id, 

:name]) }
format.html
end

end

-ants

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs