如何创建验证JSON响应的rspec测试?

时间:2011-05-13 16:45:19

标签: json ruby-on-rails-3 testing rspec cancan

我有一个方法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 个答案:

答案 0 :(得分:35)

我就是这样做的:

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,因此我无法帮助解决这个问题。

答案 1 :(得分:3)

有时候验证response是否包含有效的JSON并显示实际响应可能就足够了,这里有一个例子:

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

答案 2 :(得分:2)

试试这个:

_expected = {:order => order.details}.to_json
response.body.should == _expected

答案 3 :(得分:1)

我认为您要做的第一件事就是检查响应是否属于正确的类型,即它将Content-Type标头设置为application/json,类似于:< / p>

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响应有效性的两个测试太多,您可以将上述两个合并到一个测试中。

答案 4 :(得分:0)

要断言JSON,您也可以这样做:

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

This博客提供了更多想法。