Michael Hartl

L'écriture de tests ne garantit pas que ces erreurs ne surviendront pas, mais ils les rendent beaucoup plus faciles à localiser et à corriger. Plus encore, en écrivant des tests pour des bogues qui surviennet vraiment , nous pouvons réduire leur probabilité. Une fois que vous aurez une bonne maitrise de Rails and Ruby, vous pourrez y revenir et apprendre le testing dans un second temps.

Pour écrire des tests pour notre Application Exemple , notre outil principal sera le framework appelé RSpec , qui est un langage de domaine spécifique pour décrire le comportement du code, doublé d'un programme appelé rspec pour vérifier le comportement attendu.

Conçu pour tester n'importe quel programme Ruby, RSpec a connu un regain important dans la communauté Rails. Autotest est un outil qui joue en permanence votre suite de tests en arrière-plan, en s'appuyant sur les changements de fichiers spécifiques que vous faites. Par exemple, si vous modifiez un fichier contrôleur, Autotest jouera les tests pour ce contrôleur spécifique. Le résultat est un feedback instantané sur l'état de vos tests.

L'installation de Autotest est optionnelle, et sa configuration peut être un peu délicate, mais si vous parvenez à le faire fonctionner sur votre système, je suis certain que vous le trouverez tout comme moi très utile. Pour installer Autotest, installez les gems autotest et autotest-rails-pure 8 comme suit:. La prochaine étape dépend de votre plateforme. Si FSEvent ne s'installe pas proprement, vérifiez bien que Xcode est installé sur votre système.

Les utilisateurs Windows devront essayer d'installer Growl pour Windows et suivre ensuite les instructions de la page GitHub pour autotest-growl. À Propos des notifications Autotest. Nous lançons alors le test, dans notre cas en ajoutant l'action about et la vue correspondante. Avant d'utiliser le processus TDD, j'étais souvent surpris de découvrir que mes tests, en réalité, testaient la mauvaise chose, quand ils ne testaient pas, tout simplement, rien du tout.

En s'assurant que, dans un premier temps, le test échoue et ensuite seulement réussit , nous pouvons être plus confiant sur le fait que nous accomplissons le bon test. Il est important de comprendre que TDD n'est pas toujours le bon outil pour accomplir le travail.

Une fois que vous avez trouvé la forme générale de la solution, vous pouvez alors utiliser TDD pour implémenter une version plus efficiente. La première étape, le Rouge, se réfère à l'écriture d'un test conduisant à l'échec, que de nombreux outils de test indiquent avec la couleur rouge. L'étape suivante, Vert, se réfère à un test conduisant à la réussite, indiqué par la couleur attendue verte. Une fois que nous avons un test ou une batterie de tests qui réussit, nous sommes libres de restructurer notre code, d'en changer la forme en éliminant les répétitions par exemple sans en changer la fonction.

Nous n'avons pas encore de couleur, donc commençons par le Rouge. NdT , séparation que j'ai toujours trouvée soit fragile soit redondante, notre première étape va consister à les effacer. Si vous utilisez Git, vous pouvez le faire comme suit:. Ce code est en pur Ruby, mais même si vous avez étudié Ruby précédemment il ne vous semblera pas très familier. C'est parce que RSpec utilise la malléabilité de Ruby pour définir son propre langage de domaine domain-specific language DSL construit juste pour le testing. Le point important ici est que vous n'avez pas besoin de comprendre la syntaxe RSpec pour pouvoir utiliser RSpec.

Ça peut sembler magique dans un premier temps, mais RSpec est conçu pour se lire plus ou moins comme de l'anglais, et si vous suivez les exemples du script généré et les autres exemples de ce tutoriel, vous le maitriserez rapidement. Concentrons-nous sur le premier pour sentir ce qui se passe:. La première ligne indique que nous décrivons describe une opération GET pour l'action home.

Alors la spécification dit que lorsque vous visitez la page d'accueil, cela devrait réussir. Comme avec la première ligne, ce qui vient à l'intérieur des guillemets n'intéresse pas RSpec, ça n'est pertinent qu'aux lecteurs humains. Si vous avez installé curl , un client en ligne de commande qui peut traiter les requêtes HTTP, vous pouvez voir cela directement avec, par exemple, www. A contrario , google. Quand nous écrivons response.

Il est temps maintenant de faire jouer nos tests. Il existe plusierurs façons différentes et équivalentes de le faire. Sur certains système spécialement ceux utilisant l'invite de commande Windows , vous pourriez avoir un message d'erreur à ce stade indiquant des difficultés à trouver le programme rspec:. Dans ce cas, vous aurez besoin d'exécuter rspec par le Bundler en utilisant la commande bundle exec:. Malheureusement, de nombreuses autres choses peuvent mal tourner à ce niveau.

Si un test échoue, assurez-vous d'avoir bien migré la base de données avec rake db: Si RSpec ne fonctionne pas du tout, essayez de le désinstaller et de le ré-installer:. Si ça ne fonctionne toujours pas et que vous utilisez RVM , essayez de supprimer le gemset du tutoriel Rails et de ré-installer les gems:.

Ruby on Rails - Bootstrap e root url parte 1

Vous pouvez également jouer seulement les specs dans un sous-dossier particulier. Par exemple, la commande suivante joue uniquement ls specs des contrôleurs:. Le résultat de ces trois commandes est le même puisque le spec du contrôleur Pages est actuellement notre seul fichier de test.

Rails - Installation et squelette d'une application

En parlant de ça…. Si vous avez intallés Autotest, vous pouvez le faire travailler sur vos tests RSpec en utilisant la command autotest:. Avec Autotest jouant en arrière-tâche et les notifications Growl vous disant l'état de vos tests, vous pourriez bien devenir accro du développement TDD. Vous avez peut-être noté que les ressources-système liées à la gestion d'une suite de tests peuvent être considérables.

Cela s'explique par le fait que chaque fois que RSpec joue les tests, il doit recharger tout l'environnement Rails. Le serveur de test Spork 14 a pour but de régler ce problème. Spork charge une seule fois l'environnement, et maintient alors un pool de processus pour jouer les prochains tests. Combiné à Autotest, Spork est particulièrement utile. Configurer et faire fonctionner Spork peut être difficile, et c'est un sujet de niveau plutôt avancé.

Si vous vous sentez dépassé, n'hésitez pas à passer cette section. Avant de lancer Spork, nous pouvons obtenir une référence du temps que prend notre batterie de tests comme suit:. Ici la suite de tests prend plus de 7 secondes pour être exécutée même si les tests effectifs jouent en moins d'une dizaine de secondes.

Pour accélérer cela, nous pouvons ouvrir une fenêtre terminal dédiée aux tests, nous rendre dans le dossier Rails racine et démarrer un serveur Spork:. Dans une autre fenêtre Terminal, nous pouvons maintenant lancer notre batterie de tests avec l'option --drb 15 et vérifier que le temps de chargement de l'environnement est considérablement réduit:. Pour lancer RSpec et Spork avec Autotest, nous avons besoin de configurer RSpec pour utiliser l'option --drb par défaut, ce que nous pouvons faire en l'ajoutant au fichier de configuration.

Un petit conseil quand vous utilisez Spork: Dans le doute, quittez alors le serveur Spok avec Control-C et relancez-le:. Notez que nous avons ajouté une ligne pour dire à RSpec de rendre les vues à l'intérieur des tests du contrôleur. Le nouveau test tente d'atteindre get l'action about , et indique que la réponse en résultant doit être un succès. Sauver le contrôleur conduit Autotest à jouer les tests comme prévu. Ayant écrit un test d'échec, nous pouvons maintenant être sûr qu'en le faisant réussir, nous avons bien créé une page about qui fonctionne.

Pour finir, nous allons ajouter la Vue about. Maintenant que nous sommes au Vert, nous sommes libre de restructurer notre code en changeant sa forme sans changer sa fonction. Souvent, le codage se fait au feeling , ce qui signifie qu'il devient rapidement laid, bouffi et plein de répétitions. L'ordinateur s'en fiche, bien sûr, mais pas les humains, donc il est important de garder le code base le plus propre possible en le restructurant fréquemment.

Avoir une bonne batterie de tests qui réussissent est un outil inestimable à cet égard, car il réduit considérablement la probabilité d'introduire des bogues en cours de restructuration. Notre Application Exemple est un peu trop petite pour la restructurer maintenant, mais l'odeur de code sale s'infiltre par chaque fissure, donc nous n'aurons pas à attendre bien longtemps: Maintenant que nous avons créé les actions et les vues pour quelques pages statiques, nous allons les rendre très légèrement dynamiques en ajoutant du contenu qui change en fonction des pages: C'est un sujet épineux de décider lequel de ces changements tester, et en général, tester le code HTML peut se révéler hasardeux entendu que le contenu tend à changer fréquemment.

Nous garderons nos tests le plus simple possible en ne testant que le titre de la page. En d'autres termes, le code:. Ruby ne se soucie pas des retours à la ligne. Nous allons maintenant faire en sorte que nos tests de titre réussissent, et en même temps ajouter une structure HTML valide. Les tests pour la page d'accueil devraient maintenant réussir.

Nous avons déjà fait beaucoup de choses dans cette section, générer trois pages valides en utilisant les contrôleurs et actions Rails, mais ce sont de pures pages statiques HTML et elles ne font donc pas la démonstration de la puissance de Rails. Plus encore, elles souffrent de terribles duplications:.

Paradoxalement, nous allons passer la première étape d'élimination des duplications en en ajoutant plus encore: Cela rendra plus simple la suppression en un coup de toutes les répétions. La technique implique de créer des instances de variables à l'intérieur de nos actions. Le signe arobase, , dans le nom titre indique que c'est une variable d'instance. ERb est le principal mécanisme Rails pour inclure du contenu dynamique dans les pages web. Rails rend alors la vue, en utilisant ERb pour insérer la valeur de titre dans le gabarit, que le serveur web envoie alors à votre navigateur comme code HTML.

Le résultat est exactement le même qu'auparavant, à la différence près que la partie variable du titre est générée dynamiquement par ERb. Maintenant que nous avons remplacé la partie variable des titres de la page avec une variable d'instance et ERb, chacune de nos pages ressemble à quelque chose comme:. En d'autres mots, toutes nos pages sont identiques en structure, incluant même le titre à cause du code Ruby embarqué , avec pour seule exception le contenu de chaque page. Ne serait-il pas intéressant de structurer les éléments communs dans une sorte de gabarit global un layout , et que le contenu du body soit inséré sur cette page de base?

Vraiment, ce serait bien, et Rails nous y convie gentiment en utilisant un fichier spécial appelé application. Pour capturer le squelette de la structure, créez le fichier application. Ce code est responsable de l'insertion du contenu de chaque page dans le layout. Maintenant que nous avons un layout pour le site, nous avons aussi saisi l'opportunité d'ajouter une fonctionnalité de sécurité pour chaque page. Et, comme requis, les tests réussissent toujours.

Vu de l'extérieur, ce chapitre n'a pas accompli grand chose: Mais les apparences sont trompeuses: Run the following command to create an app called otutorial. Feel free to change the name to whatever you want. For the purposes of this guide I will assume the name of the app is otutorial. Si vous savez déjà utiliser Ruby on Rails, le contenu qui suit va vous être familier. Si vous débutez, vous remarquerez que la commande crée un sous-répertoire otutorial qui contient plusieurs fichiers et répertoires.

If you're familiar with Ruby on Rails, this is nothing new for you. If you're new to it, you'll notice that command creates an otutorial sub-directory, which contains a number of files and directories. Most of these aren't important for our purposes, so don't worry too much about them. Dans la ligne de commande, remplacez votre répertoire par le sous-répertoire otutorial.

Exécutez la commande suivante: On the command line, change your directory to the otutorial sub-directory. Let's take a quick detour to verify that the app was created successfully. Run the following command: Ouvrez un navigateur et accédez à http: Open a browser and navigate to http: You should see the default Ruby on Rails welcome page. Maintenant que nous avons confirmé le fonctionnement de Ruby on Rails, nous allons passer aux choses sérieuses. Now that we've confirmed that Ruby on Rails is working, we're ready to do some real work. Notre application sera très simple. Le fait de cliquer sur ce lien conduit à la page de connexion Azure où il peut se connecter avec son compte Office ou Outlook.

Our app will be very simple. When a user visits the site, they will see a link to log in and view their email. Clicking that link will take them to the Azure login page where they can login with their Office or Outlook. Finally, they will be redirected back to our app, which will display a list of the most recent email in the user's inbox. First let's modify the layout used by all pages in the app to add Bootstrap for basic layout and styling, and a simple nav bar.

Let's also add a little change to the application's CSS file to accomodate the nav bar we added. Dans la ligne de commande, exécutez la commande suivante: Now let's replace the default welcome page with a page of our own.

Lancement d'un environnement Elastic Beanstalk

To do that, we'll create a new controller for the home page. On the command line, run the following command: Une fois que cette commande est terminée, créez un fichier dans le répertoire. Collez le code suivant. Once that command is complete, create a new file in the. Paste in the following code.

Visite guidée : utilisez les routes et les contrôleurs

Pour cela, nous devons définir un itinéraire. As you can see, our home page will be very simple.

Tutoriel Ruby on Rails

For now, the link doesn't do anything, but we'll fix that soon. First we need to tell Rails to invoke this action. To do that, we need to define a route. Now browsing to http: New app registrations should be created and managed in the new Application Registration Portal to be compatible with Outlook. Only create new app registrations in the Azure Management Portal if your app: Bear in mind that apps registered using the Azure Management Portal will not be compatible with Outlook.

Existing app registrations that were created in the Azure Management Portal will continue to work for Office only. These registrations do not show up in the Application Registration Portal and must be managed in the Azure Management Portal. In order to use the Application Registration Portal, you need either an Office work or school account, or a Microsoft account.

If you don't have either of these, you have a number of options: Here's what the details of your app registration should look like when you are done. Pour simplifier les choses, nous allons utiliser le gem oauth2 pour gérer nos demandes OAuth. To make things easier, we'll use the oauth2 gem to handle our OAuth requests.

Enregistrez le fichier et exécutez la commande suivante redémarrez ensuite le serveur: Save the file and run the following command restart the rails server afterwards: The reason for this is that the default cookie store is limited to 4KB of data, which isn't enough for us to store the tokens we'll get back from Azure. Dans la ligne de commande, entrez les commandes suivantes pour générer la base de données de session.

On the command line, enter the following commands to generate the session database. Exécutez la commande suivante pour générer un contrôleur nommé Auth: Because of the nature of the OAuth2 flow, it makes sense to create a controller to handle the redirects from Azure. Run the following command to generate a controller named Auth: We'll start here by defining a function to generate the login URL. Nous allons également définir un URI de redirection en tant que valeur codée en dur. The first thing we do here is define our client ID and secret, and the permission scopes our app requires. We also define a redirect URI as a hard-coded value.

We'll improve on that in a bit, but it will serve our purpose for now. Enregistrez vos modifications et accédez à http: Si vous placez le curseur sur le lien, cela doit ressembler à ce qui suit: Save your changes and browse to http: If you hover over the link, it should look like: Connectez-vous à votre compte Office Votre navigateur doit vous rediriger vers notre application, et vous devez voir une erreur: Click on the link and you should be presented with a sign in page.

Sign in with your Office account. Your browser should redirect to back to our app, and you should see a lovely error: If you scroll down on Rails' error page, you can see the request parameters, which include the authorization code. Nous allons maintenant corriger cette erreur. However, Rails has shown us that we're getting the authorization code back in the request, so we're on the right track!

Let's fix that error now.