1

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

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

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

我想访问blog变量,但我不想在it { ... }块内这样做,因此无论资源如何都可以使用我的宏(例如,我想将它应用到blogspostscomments等)。

是否可以?

4

1 回答 1

3

我想访问 blog 变量,但我不想在它 { ... } 块内进行

尽量不要将其let视为正常范围的变量定义。let一种复杂的辅助方法,用于在同一示例组内的多个调用中缓存代码块的结果。您let存在于示例组中的任何内容,这意味着您无法访问外部块的letted“变量” 。it

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
于 2012-11-02T18:16:33.350 回答