使用rspec测试Ruby模块

rad*_*dan 12 ruby rspec

我很难在SO/Google上查找这个特例.我有一个带有函数的模块,为了使用它们,你必须创建一个包含/扩展模块的类,具体取决于你是否需要实例方法或类方法.

module A
  def say_hello name
    "hello #{name}"
  end

  def say_bye
    "bye"
  end
end
Run Code Online (Sandbox Code Playgroud)

如何使用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
Run Code Online (Sandbox Code Playgroud)

谢谢!

Hen*_*k N 26

您可以在测试中创建一个匿名类:

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
Run Code Online (Sandbox Code Playgroud)

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

也就是说,include并且extend是Ruby的标准功能,所以我不会测试每个模块在包含和扩展时都能正常工作 - 这通常是给定的.

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

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