Rails Controller Rspec测试

时间:2016-02-01 18:02:56

标签: ruby-on-rails ruby rspec

作为前言,我对Rails和一般的MVC格式非常陌生。

我正在使用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

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

1 个答案:

答案 0 :(得分:3)

你的规格错了。它会检查@invitations是否设置为一组邀请(这可能适合索引操作),但您的展示操作会向@invitation分配一个邀请。