From 22eb8175fe7ba65920163322ec640396a4240289 Mon Sep 17 00:00:00 2001 From: William Petit Date: Fri, 10 Apr 2015 00:30:02 +0200 Subject: [PATCH] Ajout exo Karma --- javascript/angular/exercices/karma/app/app.js | 12 ++++ .../angular/exercices/karma/karma.conf.js | 68 ++++++++++++++++++ .../angular/exercices/karma/package.json | 21 ++++++ .../exercices/karma/test/ExoControllerSpec.js | 29 ++++++++ .../angular/exercices/protractor/app/app.js | 12 ++++ .../exercices/todos/.solution/index.html | 2 +- javascript/angular/img/karma.png | Bin 0 -> 5828 bytes javascript/angular/img/ng_inspector.png | Bin 0 -> 38205 bytes javascript/angular/index.html | 4 ++ javascript/angular/plan.md | 5 +- javascript/angular/projet-outils-1.md | 26 +++++++ javascript/angular/projet-outils-2.md | 31 ++++++++ javascript/angular/projet-outils-3.md | 11 +++ javascript/angular/projet-outils-4.md | 7 ++ javascript/angular/routage-1.md | 2 +- javascript/angular/routage-2.md | 2 +- 16 files changed, 227 insertions(+), 5 deletions(-) create mode 100644 javascript/angular/exercices/karma/app/app.js create mode 100644 javascript/angular/exercices/karma/karma.conf.js create mode 100644 javascript/angular/exercices/karma/package.json create mode 100644 javascript/angular/exercices/karma/test/ExoControllerSpec.js create mode 100644 javascript/angular/exercices/protractor/app/app.js create mode 100644 javascript/angular/img/karma.png create mode 100644 javascript/angular/img/ng_inspector.png create mode 100644 javascript/angular/projet-outils-1.md create mode 100644 javascript/angular/projet-outils-2.md create mode 100644 javascript/angular/projet-outils-3.md create mode 100644 javascript/angular/projet-outils-4.md diff --git a/javascript/angular/exercices/karma/app/app.js b/javascript/angular/exercices/karma/app/app.js new file mode 100644 index 0000000..48acae9 --- /dev/null +++ b/javascript/angular/exercices/karma/app/app.js @@ -0,0 +1,12 @@ +var myApp = angular.module('myApp', []); + +myApp.controller('ExoCtrl', ['$scope', function($scope) { + + $scope.val1 = 1; + $scope.val2 = 2; + + $scope.add = function() { + $scope.result = $scope.val1 + $scope.val2; + }; + +}]); diff --git a/javascript/angular/exercices/karma/karma.conf.js b/javascript/angular/exercices/karma/karma.conf.js new file mode 100644 index 0000000..eb78d2e --- /dev/null +++ b/javascript/angular/exercices/karma/karma.conf.js @@ -0,0 +1,68 @@ +// Karma configuration +// Generated on Fri Apr 10 2015 00:15:38 GMT+0200 (CEST) + +module.exports = function(config) { + config.set({ + + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: '', + + + // frameworks to use + // available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ['jasmine'], + + + // list of files / patterns to load in the browser + files: [ + '../node_modules/angular/angular.js', + 'node_modules/angular-mocks/angular-mocks.js', + 'app/app.js', + 'test/**/*Spec.js' + ], + + + // list of files to exclude + exclude: [ + ], + + + // preprocess matching files before serving them to the browser + // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + preprocessors: { + }, + + + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://npmjs.org/browse/keyword/karma-reporter + reporters: ['progress'], + + + // web server port + port: 9876, + + + // enable / disable colors in the output (reporters and logs) + colors: true, + + + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_INFO, + + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: true, + + + // start these browsers + // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: ['Firefox'], + + + // Continuous Integration mode + // if true, Karma captures browsers, runs the tests and exits + singleRun: false + }); +}; diff --git a/javascript/angular/exercices/karma/package.json b/javascript/angular/exercices/karma/package.json new file mode 100644 index 0000000..ffe4c06 --- /dev/null +++ b/javascript/angular/exercices/karma/package.json @@ -0,0 +1,21 @@ +{ + "name": "karma-exercice", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "angular-mocks": "^1.3.15", + "karma": "^0.12.31" + }, + "devDependencies": { + "jasmine-core": "^2.2.0", + "karma-chrome-launcher": "^0.1.7", + "karma-firefox-launcher": "^0.1.4", + "karma-jasmine": "^0.3.5" + } +} diff --git a/javascript/angular/exercices/karma/test/ExoControllerSpec.js b/javascript/angular/exercices/karma/test/ExoControllerSpec.js new file mode 100644 index 0000000..e911bb6 --- /dev/null +++ b/javascript/angular/exercices/karma/test/ExoControllerSpec.js @@ -0,0 +1,29 @@ +describe('ExoController', function() { + + beforeEach(module('myApp')); + + var $controller; + + beforeEach(inject(function(_$controller_){ + $controller = _$controller_; + })); + + describe('$scope.add', function() { + + it('Il additionne les valeurs $scope.val1 et $scope.val2 et stocke le résultat dans $scope.result', function() { + + var $scope = {}; + var controller = $controller('ExoCtrl', {$scope: $scope}); + $scope.val1 = 2; + $scope.val2 = 4; + + $scope.add(); + + expect($scope.result).toEqual(6); + + + }); + + }); + +}); diff --git a/javascript/angular/exercices/protractor/app/app.js b/javascript/angular/exercices/protractor/app/app.js new file mode 100644 index 0000000..48acae9 --- /dev/null +++ b/javascript/angular/exercices/protractor/app/app.js @@ -0,0 +1,12 @@ +var myApp = angular.module('myApp', []); + +myApp.controller('ExoCtrl', ['$scope', function($scope) { + + $scope.val1 = 1; + $scope.val2 = 2; + + $scope.add = function() { + $scope.result = $scope.val1 + $scope.val2; + }; + +}]); diff --git a/javascript/angular/exercices/todos/.solution/index.html b/javascript/angular/exercices/todos/.solution/index.html index 04e01f2..5ad1309 100644 --- a/javascript/angular/exercices/todos/.solution/index.html +++ b/javascript/angular/exercices/todos/.solution/index.html @@ -37,7 +37,7 @@ - + diff --git a/javascript/angular/img/karma.png b/javascript/angular/img/karma.png new file mode 100644 index 0000000000000000000000000000000000000000..0a331a600551ed14b407e942e3c93ded97c83627 GIT binary patch literal 5828 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 vendor | bower_components | node_modules - Répertoire des librairies tierces + |-> js + | |-> controllers + | |-> services + | |-> filters + | |-> directives + | |-> templates + | |-> app.js - Point d'amorçage de l'application + |-> assets - Images, ressources textuelles ou autres... + |-> css + |-> bower.json | package.json - Manifeste pour le gestionnaire de paquet + |-> .jshintrc - Règles spécifiques de mise en forme pour le projet + |-> Makefile | Gulpfile.js | Gruntfile.js - Tâches pour pipeline de développement + |-> index.html - Point d'entrée HTML + |-> README.md - Description du projet, avec "Getting started" + |-> LICENCE +``` + +- Un seul module Angular pour l'application +- Gestionnaire de paquets pour gérer les dépendances (avec inclusion ou non des dépendances dans le dépôt) +- Définir au plus tôt les règles de validation du code, et les fixer dans le fichier `.jshintrc` diff --git a/javascript/angular/projet-outils-2.md b/javascript/angular/projet-outils-2.md new file mode 100644 index 0000000..aa674bc --- /dev/null +++ b/javascript/angular/projet-outils-2.md @@ -0,0 +1,31 @@ +# .cadoles-slide-title[Menée de projet & outils (2/)] + +**Organisation d'un projet plus important** +```text +# Structure basée sur la même idée, mais avec une approche orientée composants, récursive + +myApp-client + |-> js + |-> main.js - Amorçage de l'application + |-> config.js - Configuration de l'application + |-> app.js - Définition du module principale + |-> shared - Fonctionnalités du module + | |-> controllers + | | |-> templates - Templates liés aux contrôleurs du module + | |-> directives + | | |-> templates - Templates liés aux directives du module + | |-> filters + |-> components - Sous modules + |-> module1 + | |-> module1.js + | |-> shared + | | |... + | |-> components + | |... + |-> module2 + |-> module2.js + |-> shared + | |... + |-> components + |... +``` diff --git a/javascript/angular/projet-outils-3.md b/javascript/angular/projet-outils-3.md new file mode 100644 index 0000000..e854587 --- /dev/null +++ b/javascript/angular/projet-outils-3.md @@ -0,0 +1,11 @@ +# .cadoles-slide-title[Menée de projet & outils (3/)] + +**Extension Chromium: ng-inspector** + + +.cadoles-center[ + + + + [Disponible sur le Chromium Store](https://chrome.google.com/webstore/detail/ng-inspector-for-angularj/aadgmnobpdmgmigaicncghmmoeflnamj/related) +] diff --git a/javascript/angular/projet-outils-4.md b/javascript/angular/projet-outils-4.md new file mode 100644 index 0000000..a057501 --- /dev/null +++ b/javascript/angular/projet-outils-4.md @@ -0,0 +1,7 @@ +# .cadoles-slide-title[Menée de projet & outils (4/)] + +**Tests unitaires avec Karma & Jasmine** + +.cadoles-center[ + +] diff --git a/javascript/angular/routage-1.md b/javascript/angular/routage-1.md index e64c7ce..32529c5 100644 --- a/javascript/angular/routage-1.md +++ b/javascript/angular/routage-1.md @@ -1,4 +1,4 @@ -# .cadoles-slide-title[Routage dans le navigateur (1/)] +# .cadoles-slide-title[Routage dans le navigateur (1/3)] **Différences entre la navigation classique et la navigation côté client** .cadoles-left-column[ diff --git a/javascript/angular/routage-2.md b/javascript/angular/routage-2.md index d6a5fb9..3d04de7 100644 --- a/javascript/angular/routage-2.md +++ b/javascript/angular/routage-2.md @@ -1,4 +1,4 @@ -# .cadoles-slide-title[Routage dans le navigateur (2/)] +# .cadoles-slide-title[Routage dans le navigateur (2/3)] **Le module `ngRoute`** - Il permet de gérer l'association entre vue/contrôleur/route côté client.