当前位置: 首页 > 知识库问答 >
问题:

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

袁单鹗
2023-03-14

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

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

当我运行irb并包含调试混入和命令require_relative时/混合/调试。rb’和包括调试,然后调用调试。class\u信息 它成功返回“模块”

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

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单元测试更改为如下所示,因此它实际上调用了class\u信息 调试混合的实例方法:

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时,为什么它会返回以下错误?(注意:即使在之前完全相似的RSpec单元测试设置#1中,我检查了我可以成功访问这个调试混合实例方法)

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中共享了上述代码。

  • Ruby:Ruby 2.3.0p0(Ruby-v)
  • RSpec:3.5.4(RSpec-v)
  • 应用示例来自编程Ruby书籍的Mixins章节

共有1个答案

呼延博易
2023-03-14

当包含模块时,这些方法将成为包含类中的实例方法<代码>调试。class\u信息 不起作用,因为没有class方法class\u信息 。我也不确定你在测试中加入模块的方式是否是最好的方式。喜欢这项工作吗?

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

 类似资料:
  • 我们有一个用例,我们必须从Xlst模板调用实例方法。我们使用的是Saxon-He9.6版本。穿过了这个堆栈溢出的柱子。我们尝试用Java对象作为参数pssing XML transformer,然后更新模板以调用该实例方法。但它给出了javax.xml.Transform.TransformerConfigurationException。 如果我们可以使用Saxon HE从XSLT模板中调用实例

  • 问题内容: 我正在使用Mozilla Rhino JavaScript模拟器。它允许我将Java方法添加到上下文中,然后像调用JavaScript函数一样调用它们。但是我无法使用它,除非使用静态方法。 问题是文档的这一部分: 如果该方法不是静态的,则Java的“ this”值将对应于JavaScript的“ this”值。任何使用不正确的Java类型的’this’值调用该函数的尝试都会导致错误。

  • 通过前面的学习,类方法大体分为 3 类,分别是类方法、实例方法和静态方法,其中实例方法用的是最多的。我们知道,实例方法的调用方式其实有 2 种,既可以采用类对象调用,也可以直接通过类名调用。 通常情况下,我们习惯使用类对象调用类中的实例方法。但如果想用类调用实例方法,不能像如下这样: 运行上面代码,程序会报出如下错误: Traceback (most recent call last):   Fi

  • 要在实例上调用方法,您必须获取实例的引用并调用该方法。该示例说明了如何获取引用和调用方法,检查 API 以获取可用方法的列表。 // 3 ways of doing the same thing $('#jstree').jstree(true) .select_node('mn1'); $('#jstree') .jstree('select_node', 'mn2'); $.

  • 我创建了一个类,该类旨在获取2个分数,每个分数都有一个分子和分母,然后将它们相加,输出另一个分数。 当我编译程序时,我遇到了一个问题,涉及: 分数F3=新分数。添加(F1、F2);在主要方法中 错误:找不到类型分数$add 如果我将所有内容都设置为一个类,那么程序将运行,但我希望所有方法都严格位于Fraction类中,并在UseFraction类中调用Fraction。

  • 我正在使用Saxon(如果需要,我可以使用Xalan)XSLT处理器进行一些转换。我想将下面对象的实例作为参数传递给XSLT模板。 所以我创建了这个对象。 在XSLT文件中,我将参数声明为: 现在我的问题是如何在XSLT内调用该对象的任何实例方法(即.getValue())?有可能吗?我知道我可以调用不同Java类的静态方法,但这并不完全是我想要的。 此外,是否可以在XSLT中填充Java对象,即