2010-09-28 5 views
14

Im essayant de tester une condition où le inscription réussie d'un modèle de succès est rendu par le code du contrôleur suivantmodèles de test Rspec étant rendus


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 
 

J'utilise les spécifications suivantes pour tester ce code


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 

Mais l'exemple ne « devrait rendre la page de succès sur votre inscription réussie » avec ce message d'erreur


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 vue de réussite est un modèle stocké dans les vues/utilisateurs/sans action. Im devinant im faisant une erreur très fondamentale et voudrait de l'aide.

+0

Je supprimerait la user.save condition sur votre dernier assertion – Rimian

Répondre

24

Vous êtes en train de talonner la variable @user dans le test, mais le contrôleur instanciera une nouvelle instance afin que le talon ne soit pas en place.

Ce n'est pas une bonne idée d'utiliser un talon dans ce cas juste pour émuler un appel de sauvegarde réussi. Pourquoi ne fournissez-vous pas des données valides et assurez-vous que l'action est réussie?

Le code suivant est pour RSpec> 2.1 et il utilise la syntaxe 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 

Enfin, le changement

render :template => "success" 

à

render :action => "success" 

Pour les versions précédentes RSpec ou si vous devez utiliser la syntaxe should, utilisez

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

C'était tout. Je viens de l'avoir. Je vous remercie. Im toujours en train de comprendre travailler avec Rspec. Merci beaucoup. – Sid

Questions connexes