所以,我的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类并为其添加方法。
答案 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