2009-12-31 5 views
1

édité: suivi des suggestions. Voir à la fin de la question.Test d'intégration: créer par rapport à nouveau dans le contrôleur

J'ai un contrôleur avec deux fonctions:

def new 
    if login_required 
      @discussion = Discussion.new 
      respond_to do |format| 
        format.html # new.html.erb 
        format.xml { render :xml => @discussion } 
      end 
     end 
end 


def create 
    if login_required 
     @discussion = Discussion.new(params[:discussion]) 
     @discussion.update_attribute("user_id",session[:userid]) 
     respond_to do |format| 
     if @discussion.save 
      flash[:notice] = 'Discussion was successfully created.' 
      format.html { redirect_to(@discussion) } 
      format.xml { render :xml => @discussion, :status => :created, :location => @Discussion } 
     else 
      format.html { render :action => "new" } 
      format.xml { render :xml => @discussion.errors, :status => :unprocessable_entity } 
     end 
    end 
end 
end 

Maintenant, dans mon dossier de test d'intégration je:

test "test 1" do 
    post "https://stackoverflow.com/users/login",:user=> { :name => "bob", :password => "test_pass" } 
    post "/discussions/create", :discussion => { :title => "title 1", :body => "discussion body", :id => "101"} #Create 1 
    assert_response :success  #Assert 1 
    get "/discussions/101" 
    assert_response :success  #Assert 2 
end 

Cependant, je reçois un 302 sur Assertion 1.

Si je change "Créer 1" pour être: post "/ discussions/nouveau",: discussion => {: title => "titre 1",: corps => "corps de discussion",: id => "101"}

Je reçois une erreur 404.

1) Que se passe-t-il?

2) quels outils/options sont disponibles pour que je m'en aperçoive moi-même?

Merci

mise à jour

suggestion suivie (de Ryan Bigg):

  • message: créer, {: discussion => {}}, {: user_id => utilisateurs (: bob) .id}

Résultat:

  • rack de Lint :: LintError: variable d'env HTTP_USER_ID a une valeur non-chaîne 1976283457

toujours pas résolu.

Répondre

2

Quelques choses:

  1. Essayez de déplacer login_required à un before_filter. Pour votre test, vous devez effectuer post :create, :discussion => { ... }. Le test devrait déjà connaître le contrôleur si vous l'avez configuré correctement. Je crois que la convention de nommage est DiscussionsControllerTest du haut de ma tête.

Je pense que vous obtenez le 302 sur Assert 1 car il ne se connecte pas réellement.Essayez de passer dans les informations d'identification dans l'appel à post:

post :create, { :discussion => { } }, { :user_id => users(:bob).id } 

Le deuxième argument de post est le params Hash et le troisième argument est la session Hash. À condition que vous avez des appareils des utilisateurs chargés et ils ont une clé appelée bob, cela ne devrait trouver que et l'utiliser pour se connecter.

Une autre solution que j'utilise dans mes RSpec tests est de définir une méthode login_as qui prend un seul argument du login de l'utilisateur auquel je devrais me connecter. Ensuite, toutes les demandes que je fais dans mes tests de contrôleur ou d'intégration sont enregistrées en tant que l'utilisateur:

def login_as(name) 
    request.session[:user] = users(name).id 
end 

Je pense que vous devriez être en mesure de faire la même chose dans votre fichier test_helper.rb, mais ... Je n'ai pas essayé il. YMMV.

+0

merci, j'ai essayé vos suggestions, maintenant je reçois: rack de Lint :: LintError: variable d'env HTTP_USER_ID a une valeur non-chaîne 1976283457 – cbrulak

+0

+1 pour remarquer before_filter –

0

Tout semble fonctionner correctement dans votre contrôleur. Dans vos tests, vous envoyez une requête POST et l'action new n'accepte pas les requêtes POST, mais seulement les requêtes GET. L'action create accepte les POST, mais envoie une redirection après avoir créé une discussion avec succès.

Vous devez probablement remplacer le premier assert_response :success avec:

assert_redirected_to :controller => "discussions", :action => "show"` 
Questions connexes