Sean Magyar
Sean Magyar

Reputation: 2380

rails api testing json response

I have a 4.2.5 rails api and I guess I get this error thanks to the extracted responders. What should I change to make it work?

error:

1) Error:
Api::V1::GraphControllerTest#test_should_get_show:
ActionController::UnknownFormat: ActionController::UnknownFormat
    app/controllers/api/v1/graph_controller.rb:7:in `show'
    test/controllers/api/v1/graph_controller_test.rb:5:in `block in <class:GraphControllerTest>'

controller

class Api::V1::CategoryController < ApplicationController
  def show
    category = params[:category] || "sports"
    @category = Category.where(cat_title: category.capitalize).first
    respond_to do |format|
      format.json { render json: @category, serializer: CategorySerializer, root: "category" }
    end
  end
end

Test

require 'test_helper'

class Api::V1::CategoryControllerTest < ActionController::TestCase
  test "should get show" do 
    get :show, {'category' => 'science'}, format: :json
    assert_response :success
    assert_equal "{\"category\":{\"title\":\"science\",\"sub_categories\":1}}", @response.body
  end
end

UPDATE:

class Api::V1::CategoryController < ApplicationController
  def show
    category = params[:category] || "sports"
    @category = Category.where(cat_title: category.capitalize).first
    render json: @category, serializer: CategorySerializer, root: "category"
  end
end

This way it's working, but the root is not used:

--- expected
+++ actual
@@ -1 +1 @@
-"{\"category\":{\"title\":\"science\",\"sub_categories\":1}}"
+"{\"title\":\"science\",\"sub_categories\":1}"

UPDATE2:

With the following code it doesn't use active model serializer:

render json: { category: @category , serializer: CategorySerializer }

-"{\"category\":{\"title\":\"science\",\"sub_categories\":1}}"
+"{\"category\":    {\"cat_id\":2,\"cat_title\":\"Science\",\"cat_pages\":1,\"cat_subcats\":1,\"cat_files\":1,\"created_at\":\"2016-08-06T15:35:29.000Z\",\"updated_at\":\"2016-08-06T15:35:29.000Z\"},\"serializer\":{}}"

Upvotes: 0

Views: 413

Answers (2)

mansoor.khan
mansoor.khan

Reputation: 2616

It seems from your code that you are using active model serializers incorrectly. This Railcast and this sitepoint.com article explains how you should properly use serializers in Rails.

Upvotes: 1

hgsongra
hgsongra

Reputation: 1484

Loooks like you made a http request, either add the header Content-Type = application/json to request when you call or change your controller code as below to make it working

class Api::V1::CategoryController < ApplicationController
  def show
    category = params[:category] || "sports"
    @category = Category.where(cat_title: category.capitalize).first
    render json: { category: @category }
  end
end

Hope this will help you

Upvotes: 1

Related Questions