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

ブログ変数にアクセスしたいのですが、{ ... } ブロック内ではアクセスしたくありません

let通常スコープの変数定義と考えないようにしてください。let、同じサンプル グループ内の複数の呼び出しにわたってコード ブロックの結果をキャッシュするための複雑なヘルパー メソッドです。サンプルグループ内letのみ存在するものはすべて、ブロックlet外の「変数」にアクセスできないことを意味します。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 に答える