2010-08-28 5 views
1

Je suis très novice en matière de rails et j'ai suivi de nombreux tutoriels et exemples intéressants dans la communauté, alors d'abord merci!rspec ne pas recevoir la méthode d'enregistrement

J'ai un problème avec mon code de test. L'application fonctionne, et je peux voir à partir de la queue les journaux de test que la base de données est écrite, mais pour une raison quelconque, il ne retourne pas la méthode de sauvegarde correctement.

Ceci est fondamentalement juste de Rails Tutorial

Les cas de « succès » de Michael Hartl reviennent un « attendu sauver, mais reçu 0 fois », et le cas » d'échec réoriente au mauvais endroit. Il semble presque il est si ignorant le/bloc d'autre.

Voici le code correspondant de la spécification du contrôleur et le contrôleur

Je voudrais vraiment apprécier toute idée de cela.

Merci, -Joe


class WebsitesController < ApplicationController 
    before_filter :require_user, :only => [:new, :edit, :create, :destroy] 

    def new 
    @website = Website.new 
    @title = "Add New Website" 
    end 

    def edit 
    @website = Website.find(params[:id]) 
    @title = "Edit Website" 
    end 

    def create 
    @website = current_user.websites.build(params[:website]) 
    if @website.save 
     flash[:success] = "Website Added!" 
     redirect_to(profile_url) 
    else 
     render 'new' 
     @title = "Add New Website" 
    end 
    end 

    def destroy 

    end 

end 

require 'spec_helper' 

describe WebsitesController do 
    integrate_views 

    describe "POST 'create'" do 

    before(:each) do 
     activate_authlogic 
     @user = Factory(:user) 
     UserSession.create(@user, true) 
     @attr = { 
     :domain => "http://www.example.com", 
     :description => "example site" 
     } 
     @website = Factory(:website, @attr.merge(:user => @user)) 
     @user.websites.stub!(:build).and_return(@website) 
    end 

    describe "failure" do 

     before(:each) do 
     @website.should_receive(:save).and_return(false) 
     end 

     it "should render the 'new' page" do 
     post :create, :website => @attr 
     response.should render_template('websites/new') 
     end 
    end 

    describe "success" do 

     before(:each) do 
     @website.should_receive(:save).and_return(true) 
     end 

     it "should redirect to the profile page" do 
     post :create, :website => @attr 
     response.should redirect_to(profile_url) 
     end 

     it "should have a flash message" do 
     post :create, :website => @attr 
     flash[:success].should =~ /website added/i 
     end 
    end 
    end 
end 

Répondre

2

Il me semble que vous utilisez should_receive lorsque vous devez utiliser stub. J'ai eu du mal avec moi-même, et je suis venu avec cette règle:

use mocks/stubs when you DON'T want to test something 
use message expectations when you DO want to test something 

Dans votre cas, vous ne voulez tester que la page est rendue, la demande est redirigée, et le flash est réglé. Vous définissez ainsi les attentes de message sur ces conditions. Vous ne voulez pas tester que le modèle est enregistré ou pas enregistré, donc vous utilisez des stubs pour cela.

+0

Merci, cela semble résoudre une partie du problème. Bien que je pense que quelque chose d'un peu plus subtil se produit. La condition d'échec redirige vers le même endroit que le succès (uniquement dans les tests). Il semble presque ignorer l'instruction if/else dans le contrôleur. – jpoday

+0

Intéressant. L'action de réussite redirige-t-elle correctement? Est-il possible que 'before_filter' ne permette pas d'atteindre la sauvegarde? – zetetic

+0

L'action de réussite redirige correctement. C'est très bizarre. Si je supprime complètement le if/else et laisse simplement un @ website.save, tous les tests passent (stubbed ou devraient recevoir) mais ensuite il se plaint que les vues sont manquantes. Je pense que c'est le before_filter. J'ai le sentiment que je ne crée pas correctement le UserSession dans les tests. – jpoday

Questions connexes