我有一个方法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
答案 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" => " An email address is required "}.to_json
)
This博客提供了更多想法。