Rails,RSpec和FactoryGirl:处理协会授权

时间:2013-11-04 01:22:08

标签: ruby-on-rails rspec

我实际上在我的应用中实施了一个小用户管理。为此,每个user都属于group。 在我的组模型中,我定义了方法以获得关联:

class Group < ActiveRecord::Base
  has_many :items
  has_many :posts

  def get_items
    self.items
  end
end

然后在我的用户模型中,我正在使用委托:

class User < ActiveModel::Base
  delegate :get_items, to: :group, allow_nil: true
end

它实际上工作正常然后在我的控制器中,我可以将其称为current_user.get_items而不是current_user.group.items。我的问题出在specs内。 自从我更改后,与destroyshow方法(控制器)相关的所有内容都按预期工作:

context 'controllers' do
  login_user

  it 'should delete an item' do
    item = FactoryGirl.create(:item)
    expect{
      delete :destroy, id: item
    }.to change{ Item.count }.from(1).to(0)
  end
end

之前上述工作正常。我认为我的问题来自于我的用户工厂中没有很好地定义关联:

工厂/ users.rb的

FactoryGirl.define do
  factory :user do
    id                    1
    email                 "john@doe.com"
    password              "123456789"
    password_confirmation "123456789"
    association :group_id, factory: :group
  end
end

controller_macros.rb

def login_user
  before(:each) do
    @request.env["devise.mapping"] = Devise.mappings[:user]
    user = FactoryGirl.create(:user)
    user.confirm!
    sign_in user
  end
end

我仔细查看了我的代码,但没看到如何修复它。想法?

谢谢

修改
抱歉这么晚才回复。以下是我的items_controller

中我的销毁行为的样子
def destroy
  item = current_user.get_items.find_by id: params[:id]
  item.destroy
  redirect_to items_path, notice: 'Item deleted'
end

运行这些测试时,我得到undefined method 'destroy' for nil:NilClass

1 个答案:

答案 0 :(得分:0)

您的测试会创建一个item但我看不到工厂曾经这样做的任何迹象将其与当前用户相关联。看起来你创建了一个属于一个组的用户,一个属于其他组的用户(如果有的话),然后要求用户删除所有0个项目。