具有动态条件的rspec

时间:2012-06-30 23:34:58

标签: ruby-on-rails ruby rspec

我想在测试输出中包含一些动态数据。

如果我写这样的测试,那么它会打印出“它应该有''的东西”

我认为我对rspec的魔法和红宝石的封锁感到困惑。

我可以坚持计数在一个方法之外的方法,但这似乎是hack-ish。

任何指针?

describe 'things' do
  before :all do
    @count = 3
  end

  it "should have #{@count} things" do
    #....
    page.should have_content("entries: #{@count}")
  end


end

如果我像上面那样写一个测试,那么就打印出“它应该有''的东西”

编辑: 另一个更具体的例子

describe 'things' do
  before :all do
    @thing = FactoryGirl.create(:thing)
  end

  it "should display a thing with name #{@thing.name} " do
    #....
    page.should have_css("h1", text: @thing.name)
  end


end

2 个答案:

答案 0 :(得分:1)

实例变量在 it 方法中不起作用,但常量可以。我喜欢根据 describe 块命名它。

describe 'things' do
  THINGS_COUNT = 3

  it "should have #{THINGS_COUNT} things" do
    #....
    page.should have_content("entries: #{THINGS_COUNT}")
  end
end

修改:使用常量可确保您无法更改值。

编辑2 :动态变量应该更通用,绝不应该使用活动记录对象。

我使用的常见模式动态变量用于具有不同输入/输出的类似测试。

[ 
  [1, true],
  [2, false],
  [3, true]
].each do |number, result|
  it "should return #{result} for #{number}" do
    number.odd?.should == result
  end
 end

在这种情况下,您可以干预您的测试,并且更容易测试不同的变化。

最好将let(:person) { Factory.create(:person) }before(:each)用于特定的有效记录对象。

答案 1 :(得分:-1)

it "should have #{@count} things" do

在定义实例变量之前进行评估,因此它将是nil

但是,您可以在before块之外定义变量,它将起作用。

describe 'things' do
  count = 3

  it "should have #{count} things" do
    #....
    page.should have_content("entries: #{count}")
  end

end

修改 您可以访问块中的顶级变量。