我正在编写一个acts_as_thingy
模块,打算按照
class TestThingy
include ActsAsThingy
acts_as_thingy :name
end
ActsAsThingy
定义为
module ActsAsThingy
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def acts_as_thingy *attributes
attributes.each do |attribute|
define_method attribute do
"thingy - #{attribute.to_s}"
end
end
end
end
end
并测试为
describe ActsAsReadOnlyI18nLocalised do
let(:thingy) { TestThingy.new }
it 'has a name method' do
expect(thingy.name).to eq "thingy - name"
end
end
但是,当我运行rspec
时,永远不会调用ActsAsThingy
的{{1}}方法,并且self.included
会抱怨没有这样的方法rspec
。
我似乎错过了一些完全明显的东西,但却看不到它。
为什么在班级acts_as_thingy
时调用self.included
方法?
更新
单步执行include ActsAsThingy
我可以看到pry
之后,如果我看include ActsAsThingy
它显示为self.included_modules
那么[ActsAsThingy, PP::ObjectMixin, Kernel]
是include
工作,这不是一个路径问题或类似的东西。核心问题仍然存在;为什么不调用self.included
?
答案 0 :(得分:2)
所以事实证明我只需要添加
require 'acts_as_thingy'
到包含
class TestThingy
include ActsAsThingy
acts_as_thingy :name
end
我不确定为什么Ruby在找不到ActsAsThingy
时不会抛出错误,但它解释了为什么self.included
方法永远不会被调用(包含失败,但是默默地)。
答案 1 :(得分:-1)
检查你的范围。 检查文件需求路径。 Include用于将方法包含到其他
中模块
要求就是您要在案件中使用的内容。
阅读require和include之间的差异: What is the difference between include and require in Ruby?
这是我的问题测试代码。
class A
require_relative 'test.rb'
end
p('test')
module Test
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def p(str)
print "#{str}"
end
end
end
输出:
vagrant [test]> ruby file.rb
"test"