2009-08-07 7 views
0

C'est quelque chose qui m'a rendu fou ces derniers jours. J'ai une action qui permet aux utilisateurs authentifiés de télécharger des éléments sur le site. Je sais que l'action du contrôleur est correcte car je peux exécuter le processus manuellement mais je veux le tester en utilisant rspec.Tester des téléchargements de fichiers authentifiés dans merb

Je dois utiliser l'assistant request pour pouvoir réutiliser une session authentifiée :given pour cet ensemble de tests.

it "should allow authenticated file uploads" do 
    file = File.open(a_valid_file) 
    mock_file = mock("file") 
    mock_file.stub!(:path).and_return(file.path) 

    request(resource(:assets), :method => "POST", 
     :params => { :file => 
      {:tempfile => mock_file, :filename => File.basename(file.path)} } 
    ) 
end 

Si je point d'arrêt dans la spécification tout fonctionne bien, mais quand je lance la spécification et essayer d'accéder au chemin de l'action du contrôleur par le débogueur je reçois ceci:

e file[:tempfile].path 
NoMethodError Exception: undefined method `path' for "#[Spec::Mocks::Mock:0x3fda2a4736c0 @name=\"file\"]":String 

Je pense est que le stub!(:path) n'est pas défini pour l'objet fictif qui le fait via la requête.

La question est: est-ce que je vais dans le bon sens pour tester les téléchargements de fichiers et si ce n'est pas ce qui est un autre moyen?

Répondre

0

Je me trompais. En utilisant request il appelait to_s sur tous les paramètres, donc mon objet maquette a été passé comme "# [Spec :: Mocks :: Mock: 0x3fda2a4736c0 @name = \" fichier \ "]". Cela m'apprendra à accorder plus d'attention à la sortie d'exception.

Au lieu de cela, je devrais utiliser multipart_post et remplacer les appels d'authentification dans un bloc.

it "should allow authenticated file uploads" do 
    file = File.open(a_valid_file) 

    multipart_post(resource(:assets), :method => "POST", 
      :params => { :file => file }) do |controller| 
     controller.stub!(:ensure_authenticated).and_return(true) 
     controller.session.stub!(:user).and_return(User.first) 

    ) 
end 
Questions connexes