2010-09-28 18 views
14

Nel tentativo di testare una condizione in cui su di iscrizione di successo di un modello di successo è reso dal seguente codice di controllomodelli di test RSpec essere resi


def create 
    @user = User.new(params[:user]) 
    if @user.save 
     render :template => "success" 
    else 
     flash[:notice] = "Oops Somethings not quite right! :(" 
     render :action => "new" 
    end 
    end 
 

Sto usando la seguente specifica di testare questo codice


before(:each) do 
    @user = User.new 
    @user.attributes = valid_attributes  
    @params = valid_attributes 
    @user.stub!(:save).and_return(true) 
    end 


    def do_post 
    post :create 
    end 


    it "should create new user " do 
    count = User.count 
    do_post 
    user = User.new(@params)  
    user.save.should eql(true) 
    User.count.should eql(count + 1) 

    end 

    it "should render the success page on successful signup" do 
    do_post 
    @user.save 
    response.should render_template("success") if @user.save 
    end 

Ma l'esempio non "dovrebbe rendere pagina di successo su iscrizione successo", con questo messaggio di errore


1) 
'UsersController handling POST /users should render the success page on successful signup' FAILED 
expected "success", got "users/new.html.erb" 
./spec/controllers/users_controller_spec.rb:67: 
 

La vista di successo è un modello memorizzato nelle viste/utenti/senza un'azione. Sto cercando di im fare un errore molto fondamentale e vorrei un aiuto.

+0

vorrei togliere il user.save condizione sul tuo ultimo asserzione. – Rimian

risposta

24

Si sta eseguendo il test della variabile @user nel test, ma il controller creerà un'istanza di una nuova istanza in modo che lo stub non sia posizionato.

In questo caso non è consigliabile utilizzare uno stub solo per emulare una chiamata di salvataggio riuscita. Perché non fornite invece dati validi e assicuratevi che l'azione abbia esito positivo?

Il seguente codice è per RSpec> 2.1 e utilizza la sintassi expect.

before(:each) do 
    @params = valid_attributes 
end 

it "should create new user" do 
    @_before = User.count 
    post :create, :user => @params 

    expect(assigns(:user)).to_not be_new_record 
    expect(User.count).to eq(@_before + 1) 
end 

it "should render the success page on successful signup" do 
    post :create, :user => @params 

    expect(response).to be_successful 
    expect(response).to render_template("success") 
end 

Infine, il cambiamento

render :template => "success" 

a

render :action => "success" 

Per le versioni precedenti RSpec o se si deve utilizzare la sintassi should, utilizzare

before(:each) do 
    @params = valid_attributes 
end 

it "should create new user" do 
    @_before = User.count 
    post :create, :user => @params 

    assigns(:user).should_not be_new_record 
    User.count.should == (@_before + 1) 
end 

it "should render the success page on successful signup" do 
    post :create, :user => @params 

    response.should be_successful 
    response.should render_template("success") 
end 
+1

Era così. L'ho appena capito. Grazie. Sono ancora nel processo di comprensione del funzionamento con Rspec. Grazie mille. – Sid