2012-03-26 184 views
3

我正在使用Rspec和Rails 3进行测试。我已经测试过我的模型和帮手,但是我对如何开始测试控制器感到迷茫。几乎所有我在我的控制器行动的数据可以用下面的这些例子拉住:使用RSpec测试Rails控制器 - 如何测试:current_account.projects

@services = current_account.services 

@projects = current_person.projects 

@projects = current_account.projects.active 
# this is really @projects = current_person.account.projects.active) 

我似乎无法找到如何测试真实拉这样的数据的例子。我找到的所有例子都没有限定在某个帐户或某个人的范围内。任何人都可以给我一个关于如何模拟或存根这种安排的文章吗?这是否表示整个方法不正确?下面,我包含了一个完整的示例控制器。

任何帮助将不胜感激。

谢谢, 大卫

class ServicesController < ApplicationController 
    # Run authorizations 
    filter_resource_access 

    # Respond to ... 
    respond_to :html, :xml, :json 
    respond_to :js, :only => [:new, :create, :edit, :update, :destroy] 

    # GET /services 
    # GET /services.xml 
    def index 
    @services = current_account.services.order("name").paginate(:page => params[:page]) 

    respond_with(@services) 
    end 

    # GET /services/1 
    # GET /services/1.xml 
    def show 
    @service = current_account.services.find(params[:id]) 

    respond_with(@service) 
    end 

    # GET /services/new 
    # GET /services/new.xml 
    def new 
    @service = current_account.services.new 

    respond_with(@service) 
    end 

    # GET /services/1/edit 
    def edit 
    @service = current_account.services.find(params[:id]) 

    respond_with(@service) 
    end 

    # POST /services 
    # POST /services.xml 
    def create 
    @service = current_account.services.new(params[:service]) 

    if @service.save 
     # flash[:notice] = 'A service was successfully created.' 
    end 

    respond_with(@service, :location => services_url) 
    end 

    # PUT /services/1 
    # PUT /services/1.xml 
    def update 
    @service = current_account.services.find(params[:id]) 

    if @service.update_attributes(params[:service]) 
     # flash[:notice] = 'The service was successfully updated.' 
    end 

    respond_with(@service, :location => services_url) 
    end 

    # DELETE /services/1 
    # DELETE /services/1.xml 
    def destroy 
    @service = current_account.services.find(params[:id]) 

    if @service.destroy 
     flash[:notice] = "The service was successfully deleted." 
    else 
     flash[:warning] = @service.errors.full_messages.inject("") { |acc, message| acc += message } 
    end 

    respond_with(@service) 
    end 
end 

------ UPDATE

由于Xaid的解决方案,我能得到一个解决方案:

context "logged_in" do 
    before(:each) do 
     @current_account = Factory.create(:account) 
     controller.stub!(:current_account).and_return(@current_account) 

     @services = FactoryGirl.create_list(:service, 10, :account => @current_account) 
     @services << @current_account.services.first 
     @current_account.services.stub!(:all).and_return(@services) 
    end 


    # INDEX 
    describe "GET services" do 
     before(:each) do 
     get :index 
     end 

     it "should set @services when accessing GET /index" do 
     assigns[:services].should == @services 
     end 

     it "should respond with success" do 
     response.should be_success 
     end 
    end 
    end 

回答

4

不能使用这样的事情来测试你的'索引'行动

describe "GET 'index'" do 
    before(:each) do 
    @user = FactoryGirl.create(:user) 
    controller.stub!(:current_user).and_return(@user) 
    @services = FactoryGirl.create_list(:service, 10, :user => @user) 
    @user.services.stub!(:all).and_return(@services) 
    end 

    it "should return a list of services" do 
    get :index 
    assigns(:services).should == @services 
    end 
end 

如果我正确理解您的问题,您应该能够存根current_user.services(或项目)并使其返回一些已知值(由FactoryGirl在我的示例中生成),并检查存储在您的操作中的值(例如,您的'索引'操作中的@services)。

+0

谢谢!这是我第一次使用存根,所以我对从哪里开始有点困惑。我会给你一个镜头,让你知道它是如何为我工作的。 – 2012-03-27 03:26:22