2012-03-26 19 views
3

Ich verwende Rspec und Rails 3 zum Testen. Ich habe meine Modelle und Helfer getestet, aber ich weiß nicht, wie ich anfangen kann, Controller zu testen. Fast all meine Daten in meinen Controller-Aktionen ist so etwas wie diese Beispiele gezogen werden:Testen von Rails-Controllern mit RSpec-Test: 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) 

Ich kann keine Beispiele scheinen zu finden, wie die Daten zu prüfen, die auf diese Weise gezogen wird. Alle Beispiele, die ich gefunden habe, sind nicht auf ein Konto oder eine Person beschränkt. Kann mir jemand einen Artikel darüber geben, wie man diese Art von Arrangement vortäuscht oder stibitzt? Ist das ein Zeichen dafür, dass dieser gesamte Ansatz nicht korrekt ist? Unten habe ich einen kompletten Sample-Controller eingefügt.

Jede Hilfe würde sehr geschätzt werden.

Danke, David

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

Dank Xaid Lösung war ich in der Lage, eine Lösung zu erhalten:

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 

Antwort

4

Können Sie nicht verwenden etwas wie das, um Ihre "Index" Aktion zu testen

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 

Wenn ich Ihre Frage richtig verstanden habe, sollten Sie in der Lage sein, current_user.services (oder Projekte) zu stubben und einen bekannten Wert (in meinem Beispiel von FactoryGirl erzeugt) zurückgeben zu lassen und dies gegen den in Ihrer Aktion gespeicherten Wert zu prüfen (zum Beispiel @services in Ihrer 'index' Aktion).

+0

Danke! Dies ist mein erstes Mal mit Stubs arbeiten, so dass ich ein wenig verwirrt war, wo ich anfangen soll. Ich gebe dir eine Chance und lasse dich wissen, wie es für mich funktioniert hat. –