Rspec'在'范围之前'在上下文中

时间:2013-09-26 12:39:34

标签: ruby-on-rails-3 rspec

我在这个测试中得到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

1 个答案:

答案 0 :(得分: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

这是有效的,因为beforeit正在同一个(生成的)类实例的上下文中执行。

或者,您可以使用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将在首次引用时实例化给定变量并记住结果。