我经常构建像这样的小型单用Ruby脚本:
#!/usr/bin/env ruby
class Widget
def end_data
DATA.read
end
def render_data source_data
source_data.upcase
end
end
w = Widget.new
puts w.render_data(w.end_data)
__END__
data set to work on.
我想在我正在处理文件时将RSpec测试直接包含在文件中。这样的事情(这不起作用,但说明了我正在尝试做的事情):
#!/usr/bin/env ruby
class Widget
def end_data
DATA.read
end
def render_data source_data
source_data.upcase
end
def self_test
# This doesn't work but shows what I'm trying to
# accomplish. The goal is to have RSpec run these type
# of test when self_test is called.
describe "Widget" do
it "should render data properly" do
@w = Widget.new
expect(@w.render_data('test string')).to eq 'TEST STRING'
end
end
end
end
w = Widget.new
w.self_test
__END__
data set to work on.
我知道这不是使用RSpec的正常方式,在大多数情况下都不合适。也就是说,有时它会很好。所以,我想知道,有可能吗?
答案 0 :(得分:2)
有两件事。默认情况下,首先关闭rspec不会使用describe等方法污染全局命名空间。第二件事是你需要告诉rspec在声明后运行规范。
如果您将self_test
方法更改为
RSpec.describe "Widget" do
it "should render data properly" do
@w = Widget.new
expect(@w.render_data('test string')).to eq 'TEST STRING'
end
end
RSpec::Core::Runner.invoke
(当然已完成require 'rspec'
然后将运行您的规格)。
运行规范后,invoke
方法退出流程。如果您不想这样做,或者需要更多控制输出的位置等,您可能需要下拉到允许您控制这些内容的run
方法。