0

私はundefinded local variable or method userこのテストで を取得しています。誰か助けて?

context "[user IS signed in]" do     
  before do
      user = Fabricate(:user)
      league = Fabricate(:league)
      event = Fabricate(:event, league: league)
      @request.env["devise.mapping"] = Devise.mappings[:user]
      sign_in user
      ApplicationController.any_instance.stub(:primary_leagues).and_return([league])
  end

  it "[creates a pick for a user]" do
    post 'create', {:pick => {user_id: user.id, event_id: event.id, league_id: league.id, points_pick: "home"}}
    Pick.all.size.should eq(1)
  end
4

1 に答える 1

2

ブロックbeforeはローカル変数として宣言しuserているため、ブロック内の範囲外itです。

beforeこれを修正する最も簡単な方法は、ブロックでメンバー変数を宣言することです。

before do
  @user = Fabricate(:user)
  @league = Fabricate(:league)
  @event = Fabricate(:event, league: @league)
  ...
end

it "[creates a pick for a user]" do
  post 'create', {:pick => {user_id: @user.id, event_id: @event.id, league_id: @league.id, points_pick: "home"}}
  Pick.all.size.should eq(1)
end

これが機能するのは、 と が同じ (生成された) クラス インスタンスのコンテキストで実行されているためbeforeですit

または、変数を宣言してlet、コード例をそのままにしておくこともできます。

context "[user IS signed in]" do     
  let(:user) { Fabricate(:user) }
  let(:league) { Fabricate(:league) }
  let(:event) { Fabricate(:event, league: league) }

  before do
    @request.env["devise.mapping"] = Devise.mappings[:user]
    sign_in user
    ApplicationController.any_instance.stub(:primary_leagues).and_return([league])
  end

  it "[creates a pick for a user]" do
    post 'create', {:pick => {user_id: user.id, event_id: event.id, league_id: league.id, points_pick: "home"}}
    Pick.all.size.should eq(1)
  end

let指定された変数が最初に参照されたときにインスタンス化され、結果がメモ化されます。

于 2013-09-26T12:54:59.370 に答える