have_tag (RSpec) et assert_select (Rails) facilitent le test des vues grâce à une syntaxe proche de celle du CSS. Vérifions par exemple la présence d’un titre qui contient le texte Subtitle et d’un formulaire (id= »swap ») avec deux boutons radio et un bouton de soumission (class= »button_save ») :
response.should have_tag("h2", /Subtitle/)
response.should have_tag("form#swap[method=post]")
response.should have_tag("form#swap input[type=radio][name=?]", 'part1')
response.should have_tag("form#swap input[type=radio][name=?]", 'part2')
response.should have_tag("form#swap input.button_save[type=submit]")
Autre exemple, un formulaire AJAX dans sa div (id= »filter », mais vous avez compris maintenant) avec une liste déroulante, avec soumission par GET sur changement de la sélection :
response.should have_tag("select option", "All")
response.should have_tag("select option", /20/)
response.should_not have_tag("select option", /21/)
response.should have_tag("div#filter form[method=?]", 'get')
response.should have_tag("div#filter form select[onchange=?]", 'this.form.submit()')
La syntaxe du sélecteur a beau être proche de celle du CSS, il est difficile de s’en rappeler toutes les subtilités. C’est là qu’intervient l’excellente cheat sheet créée par Assaf Arkin de Labnotes. Indispensable
Firefox 3.1 offre bien des nouveautés intéressantes, en particulier un nouvel interpréteur de Javascript d’une extrême rapidité. La liste des évolutions entre les versions 3.0 et 3.1 est impressionnante; bien des éditeurs de logiciel en auraient fait une changement de version majeure.
Mais nous utilisons aussi des modules complémentaires dont certains sont indispensables. En ce qui me concerne, je ne pourrais développer sans Firebug ou Web Developer. Pencil me sert pour les maquettes. L’absence de All-in-one Gestures m’handicape grandement.
Heureusement, l’équipe Firefox publie l’état de compatibilité des modules les plus utilisés. La page regroupe les modules représentant 95% des usages recensés…
Capistrano est un outil de déploiement puissant et facile d’emploi, dont j’ai déjà parlé. Il tourne sous Windows, Mac OS et Linux (entre autres) et est d’une mise en service aisée si l’on connait ssh et subversion.
C’est pourquoi j’ai été fort (désagréablement) surpris quand mon récent cap deploy a échoué avec le message d’erreur suivant :
c:/ruby/lib/ruby/gems/1.8/gems/capistrano-2.5.1/lib/capistrano/recipes/deploy.rb:97:in ``': No such file or directory - svn info http://svn.example.com/
On comprend bien qu’il s’agit de ma machine mobile et portable qui tourne sous Windows Vista. Le client SVN de choix sous Windows reste sans conteste
TortoiseSVN. Malheureusement (d’une certaine manière), TortoiseSVN est un vrai client Subversion et non un
wrapper graphique s’appuyant sur l’exécutable svn (en ligne de commande donc).
Or Capistrano invoque l’exécutable sus-cité, et ne le trouve pas. Solution simple et rapide : installer le client officiel SVN, que l’on peut trouver ici.
Et hop !
Une spécification de vue sous RSpec pourrait ressembler à ça :
it "should render column titles" do
render "/feeds/index.html.erb"
response.should have_tag("tr>th", "name")
response.should have_tag("tr>th", "url")
end
Mais cette méthode ne permet pas de tester les bribes de HTML qui sont produites dans un content_for. En effet, ces bribes sont incluses directement dans le layout, pas dans la production de la vue. Pour ce faire, ajouter dans spec_helper.rb :
def content_for(name)
response.template.instance_variable_get("@content_for_#{name}")
end
Puis dans les specs :
it "should render a 'New feed' link" do
render "/feeds/index.html.erb"
content_for(:somewhere).should have_tag("a[href=?]", new_feed_path)
end
Merci à Carl-Johan Kihlbom.
Si votre nom d’utilisateur courant n’est pas celui qui vous permet d’accéder à votre système de gestion de version, vous pouvez le spécifier dans deploy.rb.
Par contre, le nom de ce symbole a été harmonisé. C’était par exemple :scm_user pour Mercurial ou :p4user pour Perforce). Il faut maintenant utiliser :scm_username, au moins pour Subversion. La compatibilité est maintenue pour Mercurial et Perforce.
Vous pouvez également spécifier :scm_password. L’inconvénient dans le cas de Subversion est que ce mot de passe est affiché en clair sur l’écran.
Bon, ce n’est pas vraiment un opérateur, mais l’idiome est assez répandu et peut surprendre. Il est utilisé pour convertir nil en false, ce qui peut éviter des tests spécifiques comme if variable.nil?
Deux petits rappels :
- ! est l’opérateur de négation logique.
- Seuls false et nil ont la valeur booléenne FAUX. Tout le reste est vrai (y compris 0, la chaîne de caractère vide, etc.
Nous en déduisons la table de vérité suivante :
| variable |
!variable |
!!variable |
| * |
false |
true |
| false |
true |
false |
| nil |
true |
false |
- = n’importe quoi sauf nil ou false, donc de valeur booléenne true.
CQFD.
RSpec offre deux fonctions pour tester les routes. La première vérifie la génération de l’URL, étant donnés les contrôleurs, actions, etc. :
route_for(:controller => 'sessions', :action => 'new').should == "/login"
La seconde fait la vérification inverse ; la requête active-t-elle les bons paramètres ?
params_from(:get, '/login').should == {:controller => 'sessions', :action => 'new'}
Il n’y a pas de fonction spécifique pour tester les routes nommées (par exemple login_path). Ça ne présente pas de difficulté particulière, mais il y a une astuce : les routes nommées ne sont chargées qu’après le première requête. Un exemple :
describe "named routing" do
before(:each) do
# If you haven't already made a get/post request through the rails integration
# session infrastructure the named routes don't get loaded
get :new
end
it "should route login_path() correctly" do
login_path.should == "/login"
end
end
La version 1.3 de Ruby Gems est sortie. Ne vous précipitez pas :
- Un bug signalé sur Windows
- Un problème potentiel de mise à jour : RubyGems 1.1 and 1.2 have problems upgrading… En gros, la commande ordinaire
gem update --system ne marche pas.
L’annonce originale est ici.
Il est toujours possible de télécharger la version 1.3 et de l’installer manuellement.
21 septembre 2008 – 19:58
Installation de RSpec
./script/plugin install git://github.com/dchelimsky/rspec.git -r 1.1.4
./script/plugin install git://github.com/dchelimsky/rspec-rails.git -r 1.1.4
./script/generate rspec
Installation d’Autotest
Création d’un modèle avec son script de test RSpec
./script/generate rspec_model <nom_du_modèle>
Lancement d’Autotest
autotest # dans le répertoire de l'application
Autotest va exécuter le script spec/models/<nom_du_modèle>_spec.rb automatiquement une première fois, puis chaque fois que vous sauvez ce fichier après y avoir ajouté un test.
Pour des explications détaillées, voir l’article de Philippe Hanrigou, Getting started with Autotest – Continuous Testing [en anglais]. Vous pouvez aussi voir comment ça se passe dans cette courte vidéo.
20 septembre 2008 – 16:07
SQLite Manager est un client graphique pour SQLite. SQLite Manager est disponible comme extension Firefox (et autre Thunderbird, Seamonky, etc.) et tourne aussi sur XULRunner. L’installer sur XULRunner permet de le lancer de manière indépendante de Firefox.
Installation sur Mac OS X
- Télécharger XULRunner : xulrunner-1.9.en-US.mac-pkg.dmg
- Installer XULRunner
- Télécharger SQLite Manager pour XULRunner : SQLiteManager_XR_0.3.10.zip
- Installer SQLite Manager en ligne de commande (lancer Terminal)
/Library/Frameworks/XUL.framework/xulrunner-bin --install-app Downloads/SQLiteManager_XR_0.3.10.zip
Lancement de SQLite Manager
L’application est disponible dans Applications/Mrinal Kant/SQLite Manager.app.