不同上下文/范围中的rspec变量

时间:2011-06-22 13:23:01

标签: ruby rspec

我正在尝试用rspec做一些事情,但我无法在我需要的地方访问我需要的变量。例如:

describe "some things" do
  it "should have things in App" do
    App.things.should_not be_nil #no problems here
    # puts App.things.count
    # => 10
  end

 # puts App.things.count
 # => 0
 App.things.each do |thing|
   #this doesn't work at all as App.things is empty 
   it "#{thing.title} should have an account number" do
      thing.acc_no.should_not be_nil  
   end
 end

我想这是因为调用不同块的时间。或许我完全忽略了这一点。

我需要迭代'事物'并对每个事物进行断言,但我不能这样做,因为事物在describe块的上下文中没有任何元素,只在it块内。

任何帮助?

2 个答案:

答案 0 :(得分:0)

看起来你做错了:为什么要测试一个集合的每一个值?

  • 创建一些灯具并测试App是否具有正确数量的已创建对象

  • 使用其中一个创建的灯具来测试具有正确值,运行验证等等...

至少,您可以使用rspec的共享示例重复常见测试:

http://blog.davidchelimsky.net/2010/11/07/specifying-mixins-with-shared-example-groups-in-rspec-2/

答案 1 :(得分:0)

我不知道这是否有帮助,但我遇到了类似的问题。我想迭代“它”块的原因是rspec失败消息将包含我迭代的东西的名称。

在我的情况下,它是一系列dom id,可能包含div,也可能不包含div,具体取决于页面上不同对象的状态。

所以我做了:

%w{preliminary_project_proposal final_project_proposal progress_report preliminary_abstract final_abstract preliminary_presentation final_presentation}.each do |id|
  it "should not show a late message for #{id}" do
    within "##{id}" do
      page.should_not have_css('.late_assignment')          
    end            
  end        
end

这很好用。正如您所指出的,我无法将数组赋值移动到变量或方法,这意味着它出现在几个地方,这不是很漂亮。