Ruby - 在include之后,self.included从未被调用过?

时间:2016-05-06 05:26:43

标签: ruby rspec module include

我正在编写一个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

2 个答案:

答案 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"