作为前言,我对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。我仍然在学习很多这些东西的含义,所以我很清楚答案可能很明显。
答案 0 :(得分:3)
你的规格错了。它会检查@invitations
是否设置为一组邀请(这可能适合索引操作),但您的展示操作会向@invitation
分配一个邀请。