2013-09-26 114 views
0

我在这个测试中得到undefinded local variable or method user。任何人帮助?Rspec'范围之前的范围

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 

回答

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将实例给定的变量,当它第一次被引用和memoize的结果。