Rails : tester l’envoi de fichier
Rails ça rox ! Mais comme pour tout, il faut correctement l’utiliser.
Et pour cela, il faut faire des test. Pas manuels, mais automatiques. Je vous laisse découvrir cela.
Cependant il y a certaines choses qui ne sont pas forcément pratiques à tester, tel que l’envoi d’un fichier.
Vous avez besoin d’un objet spécial toussa. Pas bien difficile dans l’idée. Mais tellement chiant pour un bon fainéant comme moi
Si vous avez lu l’article donné plus haut, vous avez vu la page “Testing Files Upload” qui, fonctionne bien.
Ou presque, malheureusement.
En effet l’attribut content_type est, dans “la vraie vie”, modifiable. Et ici, il est disponible uniquement en lecture. C’est bête, ça fait planter votre test alors que l’application fonctionne bien.
Mais il y a une solution heureusement ! La voici ![]()
En cherchant un peu, j’ai découvert que Rails propose une méthode permettant de tester l’envoi de fichier, méthode qui est disponible en interne.
ActionController::TestUploadedFile.new(Test::Unit::TestCase.fixture_path + 'myfile.jpeg', content_type)
Ok, cool. Si vous testez cela déjà, vous constaterez que vous avez correctement votre objet pour tester le fichier envoyé. Super !
Seulement vous ne pouvez toujours pas modifier la valeur de content_type. Alors que l’objet retourné par un vrai fichier envoyé le permet.
Allons donc un petit peu hacker Rails.
Ouvrez le fichier RUBY_PATH/gems/1.8/actionpack-2.0.2/action_controller/test_process.rb
Puis cherchez la déclaration de la class TestUploadedFile
La, vous verrez la ligne suivante :
attr_reader :content_type
Nous avons donc l’attribut content_type en lecture. Passons le en lecture-écriture :
attr_accessor :content_type
Et hop ! Vous pouvez maintenant tester votre envoi de fichier tout en modifiant le content_type ![]()
Et moi dès que j’aurai trouvé un client GIT potable sous Windows, je pourrais proposer le hack à l’équipe de développement de Rails.
[Edit : Après avoir récupéré la dernière nightly build de Rails, le bug du attr_accessor a été corrigé. Si vous avez la dernière version de Rails, il n'est donc pas utile de faire cela]



