Ruby on rails 为关联(未定义的方法'relation_delegate_class';)截取模型常量
我有一个Ruby on rails 为关联(未定义的方法'relation_delegate_class';)截取模型常量,ruby-on-rails,ruby-on-rails-4,rspec,rspec3,Ruby On Rails,Ruby On Rails 4,Rspec,Rspec3,我有一个课程模型,它与权限模型关联: app/models/lesson.rb: class Lesson < ActiveRecord::Base has_many :permissions, :class_name => 'Permission', as: :permissible, dependent: :destroy ... def create_permissions Permission::DEFAULTS[:lesson].each do |ac
课程
模型,它与权限
模型关联:
app/models/lesson.rb
:
class Lesson < ActiveRecord::Base
has_many :permissions, :class_name => 'Permission', as: :permissible, dependent: :destroy
...
def create_permissions
Permission::DEFAULTS[:lesson].each do |action, value|
..
end
end
class Permission < ActiveRecord::Base
DEFAULTS = {
lesson: {some_more_action: 15}
}
belongs_to :permissible, polymorphic: true
end
require 'rails_helper'
RSpec.describe Lesson, :type => :model do
describe "#create_permissions" do
let!(:lesson) { FactoryGirl.build_stubbed :lesson }
before(:each) do
stub_const('Permission::DEFAULTS', {lesson: {some_action: 5}})
end
it 'should create permissions' do
lesson.create_permissions
permission = lesson.permissions.first
...
end
end
end
我使用RSpecstub\u const
方法:
spec/models/lesson\u spec.rb
:
class Lesson < ActiveRecord::Base
has_many :permissions, :class_name => 'Permission', as: :permissible, dependent: :destroy
...
def create_permissions
Permission::DEFAULTS[:lesson].each do |action, value|
..
end
end
class Permission < ActiveRecord::Base
DEFAULTS = {
lesson: {some_more_action: 15}
}
belongs_to :permissible, polymorphic: true
end
require 'rails_helper'
RSpec.describe Lesson, :type => :model do
describe "#create_permissions" do
let!(:lesson) { FactoryGirl.build_stubbed :lesson }
before(:each) do
stub_const('Permission::DEFAULTS', {lesson: {some_action: 5}})
end
it 'should create permissions' do
lesson.create_permissions
permission = lesson.permissions.first
...
end
end
end
但规范失败,出现错误:
Failure/Error: permission = lesson.permissions.first
NoMethodError:
undefined method `relation_delegate_class' for Permission:Module
# /home/install/.rvm/gems/ruby-2.1.4/gems/activerecord-4.2.3/lib/active_record/relation/delegation.rb:112:in `relation_class_for'
# /home/install/.rvm/gems/ruby-2.1.4/gems/activerecord-4.2.3/lib/active_record/relation/delegation.rb:106:in `create'
# /home/install/.rvm/gems/ruby-2.1.4/gems/activerecord-4.2.3/lib/active_record/associations/collection_association.rb:41:in `reader'
# /home/install/.rvm/gems/ruby-2.1.4/gems/activerecord-4.2.3/lib/active_record/associations/builder/association.rb:115:in `permissions'
# ./spec/models/lesson_spec.rb:285:in `block (3 levels) in <top (required)>'
失败/错误:权限=lesson.permissions.first
命名错误:
权限:模块的未定义方法“关系\委托\类”
#/home/install/.rvm/gems/ruby-2.1.4/gems/activerecord-4.2.3/lib/active\u record/relation/delegation.rb:112:在“relation\u class\u for”中
#/home/install/.rvm/gems/ruby-2.1.4/gems/activerecord-4.2.3/lib/active\u record/relation/delegation.rb:106:在“创建”中
#/home/install/.rvm/gems/ruby-2.1.4/gems/activerecord-4.2.3/lib/active\u record/associations/collection\u association.rb:41:在“reader”中
#/home/install/.rvm/gems/ruby-2.1.4/gems/activerecord-4.2.3/lib/active\u record/associations/builder/association.rb:115:在“权限”中
#./spec/models/lesson_spec.rb:285:in'block(3层)in'
看起来,权限
不再是与课程模型关联的rails。有没有关于如何获得这一轮的想法
Gem版本:
rspec-3.3.0
,rspec-rails-3.3.3
,rails-4.2.3
,我遇到的唯一选择就是在一个示例中显式设置常量:
before(:each) do
Permission::DEFAULTS = {lesson: {some_action: 5}}
end
但我觉得这不是个好主意。它还提出了一些警告:
spec/models/lesson_spec.rb:279: warning: already initialized constant Permission::DEFAULTS
app/models/permission.rb:2: warning: previous definition of DEFAULTS was here
请仔细查看此错误消息:
NoMethodError:
undefined method `relation_delegate_class' for Permission:Module
权限
在这里被描述为模块
,而不是类
。我认为这是因为在存根嵌套常量时,权限
类尚未加载,RSpec也必须通过模块
存根它
请尝试以下解决方法:
before(:each) do
Permission # load real ActiveRecord Permission class
stub_const('Permission::DEFAULTS', {lesson: {some_action: 5}})
end
编辑:作为旁注,我不认为将嵌套常量公开给其他类是一个好主意,您对常量几乎没有控制权(只是更改名称或值),并且您不能像使用方法那样包装任何行为。我建议使用方法将publicPermission
的API更改为,这样也更容易存根:
class Permission < ActiveRecord::Base
DEFAULTS = {
lesson: {some_more_action: 15}
}
def self.defaults
DEFAULTS
end
end
很成功!有类似想法,但不知道这会导致RSpec改变行为。非常感谢。将在一个方法中结束它。