Как создать тест rspec, который проверяет ответ JSON? - PullRequest
15 голосов
/ 13 мая 2011

У меня есть контроллер групп с методом def inbox.

Если пользователь является членом группы, входящие возвращают объект JSON.

Если пользователь не является участником, то входящиеследует перенаправить благодаря разрешениям CanCan.

Как мне написать rspec для проверки этих двух вариантов использования?

Текущая спецификация:

require 'spec_helper'

describe GroupsController do
  include Devise::TestHelpers

  before (:each) do
    @user1 = Factory.create(:user)
    @user1.confirm!
    sign_in @user1
    @group = Factory(:group)
    @permission_user_1 = Factory.create(:permission, :user => @user1, :creator_id => @user1.id, :group => @group)
  end

  describe "GET inbox" do
    it "should be successful" do
      get inbox_group_path(@group.id), :format => :json
      response.should be_success
    end
  end
end

Маршруты:

inbox_group GET /groups/:id/inbox(.:format) {:controller=>"groups", :action=>"inbox"}

Файл маршрутов:

resources :groups do
  member do
    get 'vcard', 'inbox'
  end
  ....
end

Ответы [ 5 ]

35 голосов
/ 13 мая 2011

Вот как я это делаю:

describe "GET index" do
  it "returns correct JSON" do
    # @groups.should have(2).items
    get :index, :format => :json
    response.should be_success
    body = JSON.parse(response.body)
    body.should include('group')
    groups = body['group']
    groups.should have(2).items
    groups.all? {|group| group.key?('customers_count')}.should be_true
    groups.any? {|group| group.key?('customer_ids')}.should be_false
  end
end

Я не использую cancan, поэтому не могу помочь с этой частью.

3 голосов
/ 27 ноября 2013

Иногда может быть достаточно проверить, содержит ли response действительный JSON, и показать фактический ответ в противном случае, вот пример:

it 'responds with JSON' do
  expect {
    JSON.parse(response.body)
  }.to_not raise_error, response.body
end
2 голосов
/ 17 октября 2011

Попробуйте это:

_expected = {:order => order.details}.to_json
response.body.should == _expected
1 голос
/ 14 сентября 2015

Я думаю, первое, что вы хотите сделать, это проверить, что ответ имеет правильный тип, то есть заголовок Content-Type установлен на application/json, что-то вроде:

it 'returns JSON' do
  expect(response.content_type).to eq(Mime::JSON)
end

Затем, в зависимости от вашего случая, вы можете проверить, можно ли проанализировать ответ как JSON, например, wik предложил:

it 'responds with JSON' do
  expect {
    JSON.parse(response.body)
  }.to_not raise_error
end

И вы можете объединить вышедва в один тест, если вы чувствуете, что два теста для проверки правильности ответа JSON - это слишком много.

0 голосов
/ 15 мая 2011

Чтобы подтвердить JSON, вы можете сделать это тоже:

ActiveSupport::JSON.decode(response.body).should == ActiveSupport::JSON.decode(
  {"error" => " An email address is required "}.to_json
)

Этот блог дает еще несколько идей.

...