在“it”块之外访问ExampleGroup范围

时间:2012-11-02 14:44:19

标签: ruby rspec

我正在尝试使用RSpec的宏来干我的规格,我遇到了一个问题。

describe "..." do
  let!(:blog) { create(:blog) }

  post "/blogs/#{blog.id}/posts" do
    # some macros
  end
end

我希望能够访问blog变量,但我不想在it { ... }块内执行此操作,因此无论资源如何都可以使用我的宏(例如我想应用它)到blogspostscomments等。

有可能吗?

1 个答案:

答案 0 :(得分:3)

  

我想访问博客变量,但我不希望在{...}块

中进行访问

尽量不要将let视为通常范围的变量定义。 leta complex helper method for caching the result of a code block across multiple calls within the same example group。您let 的任何内容都存在于示例组中,这意味着您无法访问let块之外的it ted“变量”。

require 'spec'

describe "foo" do 
  let(:bar) { 1 }

  bar
end
# => undefined local variable or method `bar'

也就是说,如果你只是想在多个例子中重用create(:blog)的结果,你可以这样做:

describe "foo" do
  let(:blog) { create(:blog) }

  it "does something in one context" do  
    post "/blogs/#{blog.id}/posts"

    # specification
  end

  it "does something else in another context" do  
    post "/blogs/#{blog.id}/comments"

    # specification
  end
end