应用程序变量在测试环境中为零

问题描述:

我的应用程序工作正常,但我无法通过测试。如果答案是显而易见的,我是新手,所以原谅我。应用程序变量在测试环境中为零

我需要每一个视图中可用的变量,所以我这样做内application_controller.rb

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    before_filter :course 
    def course 
    @course = Course.find_slug(params[:course]) 
    end 
end 

我的测试情况是这样的:

it "creates an attempt" do 
    sign_in current_user 
    params = {:id => challenge.id, :description => "this was hard!", :course => "design"} 
    @course = FactoryGirl.create(:course) 
    post :completed, params 
    response.should redirect_to "/#{@course.slug}/?challenge_slug=" + challenge.slug 
    Attempt.count.should == 1 
    Attempt.last.description.should == params[:description] 
end 

我的控制器内的方法看起来像这样的:

def completed 
    @challenge = Challenge.find(params[:id]) 
    @challenge.completed(current_user, params) 
    redirect_to "/#{@course.slug}/?challenge_slug=" + @challenge.slug.to_s 
    end 

所有这一切,如果我使用的应用A工作正常N,但测试说:

1) ChallengesController completing a challenge creates an attempt 
    Failure/Error: post :completed, params 
    NoMethodError: 
     undefined method `slug' for nil:NilClass 
    # ./app/controllers/challenges_controller.rb:16:in `completed' 
    # ./spec/controllers/challenges_controller_spec.rb:36:in `block (3 levels) in <top (required)>' 

如果我硬编码我控制器说redirect_to "#{'expected_value'}",则测试通过,所以它似乎在测试环境中,我没有访问应用程序变量@course,这是正确的?

我迷失在如何解决这个问题。任何帮助表示赞赏。

一个解决方案是存根find方法并返回实例变量。

before(:each) do 
    @course = FactoryGirl.create(:course) 
    Course.stub(:find_slug).and_return(@course) 
end 

这使得你的测试更健壮的测试“find_slug”应该是在你的课程模式,而不是控制。

+0

啊,我明白了!谢谢! – Duopixel 2012-04-26 06:14:31