使用RSpec测试模块内部的类

时间:2013-10-06 04:14:49

标签: ruby-on-rails ruby testing rspec rspec-rails

所以,我的ruby代码中有一个模块,看起来像这样:

module MathStuff
  class Integer
    def least_factor
      # implementation code
    end
  end
end

我有一些RSpec测试,我想测试我的Integer#least_factor方法是否按预期工作。为简单起见,我们会说测试都在同一个文件中。测试看起来像这样:

describe MathStuff do
  describe '#least_factor' do
    it 'returns the least prime factor' do
      expect(50.least_factor).to eq 2
    end
  end
end

不幸的是,当我运行测试时,我收到如下错误:

NoMethodError:
    undefined method `least_factor' for 50:Fixnum

如果您知道如何包含MathStuff::Integer课程进行测试,请与我们联系。

注意:为了澄清,我实际上是在尝试打开Ruby Integer类并为其添加方法。

3 个答案:

答案 0 :(得分:3)

在Ruby 2.1中添加refinements之前(以及2.0中的实验性支持),您不能将像这样的monkeypatch的范围限制为特定的上下文(即模块)。

但是你的例子不起作用的原因是在Mathstuff模块下定义一个Integer类会创建一个与Integer核心类无关的新类。覆盖核心类的唯一方法是在顶层打开类(不在模块中)。

我通常将核心扩展放在lib / core_ext子目录中,以你正在修补的类命名,在你的案例中为lib / core_ext / integer.rb。

答案 1 :(得分:2)

您的代码应如下所示:

describe MathStuff::Integer do
  describe '#least_factor' do
    it 'returns the least prime factor' do
      expect(MathStuff::Integer.new.least_factor).to eq 2
    end
  end
end

但是您正在调用50.least_factor而50是Fixnum对象,而不是您的MathStuff::Integer,并且没有定义该方法。

答案 2 :(得分:0)

简单但不推荐的方式:

require "rspec"

class Integer
  def plus_one
    self + 1
  end
end

describe 'MathStuff' do
  describe '#plus_one' do
    it 'should be' do
      expect(50.plus_one).to eq 51
    end
  end
end

$ rspec test.rb
.

Finished in 0.01562 seconds
1 example, 0 failures