我在这个测试中得到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
答案 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
这是有效的,因为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
将在首次引用时实例化给定变量并记住结果。