用rspec测试Ruby模块

我在SO / Google这个特殊情况下找不到时间.我有一个模块的功能,为了使用它们,你必须创建一个类,其中包含/扩展模块,如果你想要实例方法或类方法.
module A
  def say_hello name
    "hello #{name}"
  end

  def say_bye
    "bye"
  end
end

如何使用rspec测试此模块?

我有这样的东西,我不知道我应该创建该类并扩展Module的点.

describe A do
  class MyClass
    extend A
  end

  before(:each) { @name = "Radu" }

  describe "#say_hello" do
    it "should greet a name" do
      expect(Myclass.say_hello(@name)).to eq "hello Radu"
    end
  end
end

谢谢!

解决方法

您可以在测试中创建一个匿名类:
describe A do
  let(:extended_class) { Class.new { extend A } }
  let(:including_class) { Class.new { include A } }

  it "works" do
    # do stuff with extended_class.say_hello
    # do stuff with including_class.new.say_hello
  end
end

要在实际代码中看到类似的东西,我已经使用了这个策略为testing my attr_extras lib.

也就是说,包含和扩展是Ruby的标准功能,所以我不会测试每个模块在包含和扩展时是如何工作的 – 通常是给定的.

如果您在测试中创建一个命名类,就像您在问题中所做的那样,我相信在测试运行期间,该类将全局存在.所以这个类会在测试套件的每个测试之间泄漏,可能会导致某处的冲突.

如果您使用let创建一个匿名类,它将只在此特定测试中可用.没有指向它的全局常量可能与其他测试冲突.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...