在Ruby类中嵌入RSpec测试

时间:2014-08-22 09:29:13

标签: ruby rspec

我经常构建像这样的小型单用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的正常方式,在大多数情况下都不合适。也就是说,有时它会很好。所以,我想知道,有可能吗?

1 个答案:

答案 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方法。