2016-02-01 243 views
2

为了序言,我对Rails和通用MVC格式非常陌生。Rails控制器Rspec测试

我使用Rspec的做我的所有测试和我在与这段代码在我controller_spec一个问题:

describe "GET show" do 
    context 'with an admin user signed in' do 
     with :admin 
     let!(:invitation) { create :invitation } 
     before do 
     sign_in admin 
     get :show, id: invitation.id 
     end 
     it { should respond_with :ok } 
     it { should respond_with_content_type :html } 
     it { should render_template :show } 
     it "assigns the requested invitation as @invitation" do 
     expect(assigns(:invitations)).to eq([invitation]) 
     end 
    end 
    end 

这是我得到的错误:

14) InvitationsController GET show with an admin user signed in assigns the requested invitation as @invitation 
    Failure/Error: expect(assigns(:invitations)).to eq([invitation]) 

     expected: [#<Invitation id: 98, token: "blah", name: "Team", number_of_uses: 5, created_at: "2016-01-29 20:43:27", updated_at: "2016-01-29 20:43:27">] 
      got: nil 

     (compared using ==) 
    # ./spec/controllers/invitations_controller_spec.rb:53:in `block (4 levels) in <top (required)>' 

最后,这里分别是我的控制器和策略类片段。

控制器:

class InvitationsController < ApplicationController 
    before_action :set_invitation, only: [:show, :edit, :update, :destroy] 

    respond_to :html 

    def index 
    authorize Invitation 
    @invitations = policy_scope(Invitation) 
    respond_with(@invitations) 
    end 

    def show 
    authorize @invitation 
    respond_with(@invitation) 
    end 

invitation_policy.rb:

class InvitationPolicy < ApplicationPolicy 
    Scope = Struct.new(:user, :scope) do 
    def resolve 
     Invitation.all 
    end 
    end 

    def index? 
    user.admin? 
    end 

    def show? 
    user.admin? 
    end 

我使用的是这里的有关宝石权威人士和FactoryGirl。我仍然在学习很多这些东西的含义,所以我很清楚答案可能很明显。

+0

你的'sign_in admin'在做什么?你是否在扼杀'sign_in'? – Leito

回答

3

您的配置错误。它会检查@invitations是否设置为一系列邀请(这可能适用于索引操作),但您的显示操作会将一个邀请分配给@invitation

+0

很好的发现,答案总是比他们看起来简单。 – Leito