2010-06-04 2 views
1

Je suis au chapitre 10 du livre Foundation Rails 2. Nous travaillons avec RSpec.Pourquoi mon test Ruby on Rails RSpec passe-t-il avec @plugin et @plugins?

Nous testons l'action 'index' du 'PluginsController'.

Voici le code pour le contrôleur:

class PluginsController < ApplicationController 
     # GET /plugins 
     # GET /plugins.xml 
     def index 
     @plugins = Plugin.find(:all) 

     respond_to do |format| 
      format.html # index.html.erb 
      format.xml { render :xml => @plugins } 
     end 
     end 

Voici le code pour les tests de ce contrôleur:

require File.dirname(__FILE__) + '/../spec_helper' 

describe PluginsController, " GET to /plugins" do 

    before do 
    @plugin = mock_model(Plugin) 
    Plugin.stub!(:find).and_return([@plugin]) 
    end 

    it "should be successful" do 
    get :index 
    response.should be_success 
    end 

    it "should find a list of all plugins" do 
    Plugin.should_receive(:find).with(:all).and_return([@plugin]) 
    get :index 
    end 


    it "should assign the list of plugins to a variable to be used in the view" 


    it "should render the index template" 

end 

Quand nous écrivions notre test, je pensais que cette ligne

Plugin.should_receive(:find).with(:all).and_return([@plugin]) 

aurait dû avoir

@plugins 

et non

@plugin 

parce que dans le contrôleur, nous avons

def index 
@plugins = Plugin.find(:all) 

Je voulais voir ce qui se passerait si je changeais

Plugin.should_receive(:find).with(:all).and_return([@plugin]) 

à

Plugin.should_receive(:find).with(:all).and_return([@plugins]) 

et le test réussi.

Alors ... pourquoi est-ce @plugin et pas @plugins? Et ... pourquoi le test passe-t-il avec les deux?

À la votre!

Répondre

0

Lorsque vous avez une variable indéfinie, comme @plugins est puisque vous ne le définissez pas plus tôt dans le test, il apparaîtra comme nul.

Ce que Plugin.should_receive(:find).with(:all).and_return([@plugins]) fait réellement dans ce cas est qu'il indique Plugin.find(:all) pour renvoyer [nil], ce qui selon votre test est valide.

+0

OK, c'est logique. Merci, Jimmy. Je me demande encore, mais ... dans 'PluginsController' nous avons index def = @plugins Plugin.find (: tous) alors pourquoi ne pas utiliser @plugins dans le test? Pourquoi utilisons-nous @plugin comme dans @plugin = mock_model (Plugin)? – user169320

+0

Eh bien, cela dépend de vous. C'est juste une variable d'instance utilisée dans les tests, donc vous pouvez choisir le nom que vous voulez. Peut-être un meilleur nom serait '@ mocked_plugin'. Je suppose que la raison pour laquelle ils l'ont appelé '@ plugin' et non' @ plugins' dans le livre est parce que ce n'est pas un tableau de mocks (seulement une seule instance, donc pas de pluriel) –

Questions connexes