无法从 RSpec 调用 Ruby mixin 实例方法

Unable to call Ruby mixin instance method from RSpec

Objective:

我想 运行 对名为 Debug 的 mixin(模块)的实例方法进行基本 RSpec 单元测试。以下是 Debug mixin 的文件内容:

混合文件:./mixins/debug.rb

module Debug
  public
    def class_info?
      "#{self.class.name}"
    end
end

验证可从 RSpec:

访问的调试 mixin 实例方法

当我 运行 irb 并使用命令 require_relative './mixins/debug.rb'include Debug 包含 Debug mixin,然后调用 Debug.class_info? 它成功 returns "Module"

然后如果我运行rspec用下面的RSpec单元测试来确认RSpec上下文可以访问mixin的实例方法,测试成功通过:

RSpec 单元测试设置 #1:./spec/mixins/debug_spec.rb

require_relative '../../mixins/debug.rb'

RSpec.describe Debug, "#class_info?" do
  include Debug

  before(:each) do
    @class_info_instance_method = Debug.instance_methods[0].to_s
  end

  context "with mixins" do
    it "has class info instance method" do
      expect(@class_info_instance_method).to eq "class_info?"
    end
  end
end

从 RSpec 调用 Debug mixin 实例方法时出现问题:

最后,我将 RSpec 单元测试更改为如下所示,因此它实际上调用了 Debug mixin 的 class_info? 实例方法:

RSpec 单元测试设置#2:./spec/mixins/debug_spec.rb

require_relative '../../mixins/debug.rb'

RSpec.describe Debug, "#class_info?" do
  include Debug

  before(:each) do
    @class_info = Debug.class_info?
  end

  context "with mixins" do
    it "shows class info" do
      expect(@class_info).to eq "Module"
    end
  end
end

但是现在我在命令行运行rspec的时候,为什么会出现return下面的错误呢?(注意:即使在之前的 RSpec 单元测试设置 #1 中完全相似,我检查过我可以成功访问此 Debug mixin 实例方法)

1) Debug#class_info? with mixins shows class info
   Failure/Error: @class_info = Debug.class_info?

   NoMethodError:
     undefined method `class_info?' for Debug:Module

注意:以上代码我已经分享到我的RubyTest GitHub repo.

设置和参考资料:

我的系统:

参考文献:

当您包含一个模块时,这些方法将成为包含的 class 中的实例方法。 Debug.class_info? 不起作用,因为没有 class 方法 class_info?。我也不确定您将模块包含在测试中的方式是否是最好的方式。这样的东西行得通吗?

require_relative '../../mixins/debug.rb'

class TestClass
  include Debug
end

RSpec.describe Debug, "#class_info?" do

  let(:test_instance) { TestClass.new }

  context "with mixins" do
    it "shows class info" do
      expect(test_instance.class_info?).to eq "TestClass"
    end
  end

end