Rspec测试失败

时间:2012-07-09 23:24:30

标签: ruby-on-rails rspec

以下控制器测试失败,我无法弄清楚原因:

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中的条件有关,但我不知道通过测试会是什么样的......

1 个答案:

答案 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的可怕行)也将具有与规范期望相关的外出。