以下控制器测试失败,我无法弄清楚原因:
describe "GET 'index'" do
before(:each) do
@outings = FactoryGirl.create_list(:outing, 30)
@user = FactoryGirl.create(:user)
end
it "should be successful" do
get :index
response.should be_success
end
end
Rspec提供了(相当无用的)错误:
Failure/Error: response.should be_success
expected success? to return true, got false
以下是实际控制器的代码:
def index
if @user
@outings = Outing.where(:user_id => @user.id)
@outing_invites = OutingGuest.where(:user_id => @user.id)
else
flash[:warning] = "You must log in to view your Outings!"
redirect_to root_path
end
end
任何人都知道导致我的测试失败的原因是什么?我假设它可能与Outing Controller中的条件有关,但我不知道通过测试会是什么样的......
答案 0 :(得分:1)
您在两个单独的类之间混淆了实例变量 - 控制器是它自己的类,规范是它自己的类。他们不共享国家。你可以尝试这个简单的例子来更好地理解......
def index
// obvious bad code, but used to prove a point
@user = User.first
if @user
@outings = Outing.where(:user_id => @user.id)
@outing_invites = OutingGuest.where(:user_id => @user.id)
else
flash[:warning] = "You must log in to view your Outings!"
redirect_to root_path
end
end
我猜你FactoryGirl.create_list(:outing, 30)
没有创建一个关联第一个用户和郊游的郊游,因为你在创建郊游后创建了用户,所以你的Outing.where
也会失败。
了解当您将数据库包含在测试堆栈中时,数据库需要以测试期望的方式包含数据,这一点非常重要。因此,如果您的控制器正在查询属于特定用户的外出,那么您的规范需要设置环境,以便控制器将检索的用户(在这种情况下,我的示例中带有User.first
的可怕行)也将具有与规范期望相关的外出。