Rails 控制器 Rspec 测试

3

首先声明,我对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)>'

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

Policy:

策略类:
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。我仍在学习这些事物的含义,所以我很清楚答案可能很显然。


你的 sign_in admin 在做什么?你是在桩测试 sign_in 吗? - Leonel Galán
1个回答

3
你的规范有误。它检查@invitations是否设置为一组邀请(这可能适用于索引操作),但您的显示操作将单个邀请分配给@invitation

干得好,发现答案总是比看起来简单。 - Leonel Galán

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接