Skip to content

Commit 76c0f95

Browse files
Fix the test part
1 parent 8a28cf8 commit 76c0f95

File tree

7 files changed

+98
-43
lines changed

7 files changed

+98
-43
lines changed

readme.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,10 @@ $ npm start
158158

159159
Rendez-vous ensuite sur http://localhost:3000 pour parcourir la documentation des différentes routes disponibles. Nous vous recommandons de passer au moins une fois sur cette documentation afin d'avoir une idée globale des données fournies par l'API pour alimenter votre application.
160160

161+
## Tests
162+
163+
De manière générale, chaque étape du workshop (hormis les premières) possède des tests pour valider le fonctionnement de l'application. Ces tests vont vous permettre de savoir ou vous en êtes dans l'étape courante. N'hésitez pas à lire les tests pour voir de quelle façon l'application doit se comporter, ainsi qu'à lancer la commande magique (`npm test`) à tout moment.
164+
161165
## Les étapes du workshop
162166

163167
* [Etape 0](/step-0)

step-2/readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Pour lancer l'application de l'étape 1, exécutez la commande `npm start` (apr
1010

1111
Dans cette étape, vous allez avoir besoin de l'API. Pour l'exécuter, lancez la commande `npm start` dans le dossier `api`.
1212

13-
Vous avez également la possibilité de lancer les tests de l'étape 2 (que nous avons rédigé pour vous) en utilisant la commande `npm run test` afin de voir quelles parties de l'étape fonctionnent et quelles parties ne fonctionnent pas du tout.
13+
Vous avez également la possibilité de lancer les tests de cette étape (que nous avons rédigé pour vous) en utilisant la commande `npm test` afin de voir quelles parties de l'étape fonctionnent et quelles parties ne fonctionnent pas du tout. N'hésitez pas à lire le code des tests afin d'avoir quelques indications en plus sur la façon d'écrire votre application.
1414

1515
## Objectif
1616

step-3/readme.md

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ Pour lancer l'application de l'étape 2, exécutez la commande `npm start` (apr
1010

1111
Dans cette étape, vous allez avoir besoin de l'API. Pour l'exécuter, lancez la commande `npm start` dans le dossier `api`. La documentation de l'API est disponible à l'adresse http://localhost:3000
1212

13+
Vous avez également la possibilité de lancer les tests de cette étape (que nous avons rédigé pour vous) en utilisant la commande `npm test` afin de voir quelles parties de l'étape fonctionnent et quelles parties ne fonctionnent pas du tout. N'hésitez pas à lire le code des tests afin d'avoir quelques indications en plus sur la façon d'écrire votre application.
14+
1315
## Objectif
1416

1517
Maintenant que notre application possède les fonctionnalités de base, nous allons commencer a nous attaquer à la navigation.
@@ -128,7 +130,9 @@ vous pouvez évidemment l'ajouter via la ligne de commande :
128130
npm install --save [email protected]
129131
```
130132

131-
Maintenant nous pouvons commencer l'intégration du router (l'intégration de base est présente dans le projet mais vous pouvez tout de même lire les paragraphes suivant). Pour ce faire, commençons par lire [l'introduction](https://github.com/reactjs/react-router/blob/master/docs/Introduction.md) à `react-router` puis importons les APIs dans `app.js`
133+
Maintenant nous pouvons commencer l'intégration du router (l'intégration de base est présente dans le projet mais vous pouvez tout de même lire les paragraphes suivant).
134+
135+
Pour ce faire, commençons par lire [l'introduction](https://github.com/reactjs/react-router/blob/master/docs/Introduction.md) à `react-router` puis importons les APIs dans `src/app.js`. Pour des raisons de testabilité, nous allons faire en sorte d'encapsuler toute l'application et son système de routage dans un composant dédié dans `src/app.js` et faire en sorte que ce composant puisse recevoir une API `history` dédiée (différente en environnement de test). La montage de ce composant dans le DOM sera effectué dans le fichier `src/indexj.js`
132136

133137
```javascript
134138
import { Router, Route, browserHistory, IndexRoute } from 'react-router';
@@ -140,22 +144,30 @@ l'initialisation du routeur se fera de la façon suivante :
140144
import { Router, Route, browserHistory, IndexRoute } from 'react-router';
141145
import NotFound from './components/not-found';
142146

143-
ReactDOM.render(
144-
<Router history={browserHistory}>
145-
<Route path="/" component={???}>
146-
<IndexRoute component={???} />
147-
...
148-
<Route path="*" component={NotFound} />
149-
</Route>
150-
</Router>,
151-
document.getElementById('main')
152-
);
147+
export const App = React.createClass({
148+
propTypes: {
149+
history: PropTypes.object,
150+
},
151+
render() {
152+
const history = this.props.history || browserHistory;
153+
return (
154+
<Router history={history}>
155+
<Route path="/" component={???}>
156+
<IndexRoute component={???} />
157+
...
158+
<Route path="*" component={NotFound} />
159+
</Route>
160+
</Router>,
161+
);
162+
}
163+
});
153164
```
154165
155166
Ici nous configurons le routeur pour utiliser l'API `history`, tirée de HTML5, du navigateur comme URL de routage côté client. Cette API permet de faire varier l'URL du navigateur sans pour autant déclencher un rechargement de la page.
156167
157168
```javascript
158-
<Router history={browserHistory}> ... </Router>
169+
const history = this.props.history || browserHistory;
170+
<Router history={history}> ... </Router>
159171
```
160172
161173
puis nous spécifions un container qui aura le role d'afficher la vue courante du router et qui sera le point d'entrée de l'application.
@@ -167,7 +179,7 @@ puis nous spécifions un container qui aura le role d'afficher la vue courante d
167179
D'après le tutorial de `react-router`, ce genre de composant peut s'écrire de la façon suivante :
168180
169181
```javascript
170-
const App = React.createClass({
182+
const MyApp = React.createClass({
171183
render() {
172184
return (
173185
<div>

step-4/readme.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ Pour lancer l'application de l'étape 3, exécutez la commande `npm start` (apr
1010

1111
Dans cette étape, vous allez avoir besoin de l'API. Pour l'exécuter, lancez la commande `npm start` dans le dossier `api`. La documentation de l'API est disponible à l'adresse http://localhost:3000
1212

13+
Vous avez également la possibilité de lancer les tests de cette étape (que nous avons rédigé pour vous) en utilisant la commande `npm test` afin de voir quelles parties de l'étape fonctionnent et quelles parties ne fonctionnent pas du tout. N'hésitez pas à lire le code des tests afin d'avoir quelques indications en plus sur la façon d'écrire votre application.
14+
1315
## Objectif
1416

1517
L'objectif de cette étape est d'ajouter des fonctionnalités sur la fiche de description d'un vin, à savoir :

step-5/readme.md

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ Pour lancer l'application de l'étape 4, exécutez la commande `npm start` (apr
1010

1111
Dans cette étape, vous allez avoir besoin de l'API. Pour l'exécuter, lancez la commande `npm start` dans le dossier `api`. La documentation de l'API est disponible à l'adresse http://localhost:3000
1212

13+
Vous avez également la possibilité de lancer les tests de cette étape (que nous avons rédigé pour vous) en utilisant la commande `npm test` afin de voir quelles parties de l'étape fonctionnent et quelles parties ne fonctionnent pas du tout. N'hésitez pas à lire le code des tests afin d'avoir quelques indications en plus sur la façon d'écrire votre application.
14+
1315
## Objectif
1416

1517
Dans cette étape, nous allons intégrer [Redux](http://redux.js.org/index.html) a notre magnifique application.
@@ -242,7 +244,7 @@ import { WineListPage } from './components/wine-list';
242244
import { WinePage } from './components/wine';
243245
import { NotFound } from './components/not-found';
244246

245-
import { Router, Route, hashHistory, IndexRoute } from 'react-router';
247+
import { Router, Route, browserHistory, IndexRoute } from 'react-router';
246248

247249
import { Provider } from 'react-redux';
248250
import { createStore } from 'redux';
@@ -252,19 +254,26 @@ const store = createStore(app);
252254

253255
...
254256

255-
ReactDOM.render(
256-
<Provider store={store}>
257-
<Router history={hashHistory}>
258-
<Route path="/" component={WineApp}>
259-
<IndexRoute component={RegionsPage} />
260-
<Route path="regions/:regionId" component={WineListPage} />
261-
<Route path="regions/:regionId/wines/:wineId" component={WinePage} />
262-
<Route path="*" component={NotFound} />
263-
</Route>
264-
</Router>
265-
</Provider>
266-
, document.getElementById('main')
267-
);
257+
export const App = React.createClass({
258+
propTypes: {
259+
history: PropTypes.object
260+
},
261+
render() {
262+
const history = this.props.history || browserHistory;
263+
return (
264+
<Provider store={store}>
265+
<Router history={history}>
266+
<Route path="/" component={WineApp}>
267+
<IndexRoute component={RegionsPage} />
268+
<Route path="regions/:regionId" component={WineListPage} />
269+
<Route path="regions/:regionId/wines/:wineId" component={WinePage} />
270+
<Route path="*" component={NotFound} />
271+
</Route>
272+
</Router>
273+
</Provider>
274+
);
275+
}
276+
});
268277
```
269278

270279
Provider va simplement alimenter le context `react` avec un champ `store`. (pour plus de détails sur le contexte `react`, voir [https://facebook.github.io/react/docs/context.html](https://facebook.github.io/react/docs/context.html))

step-5/src/app.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const store = createStore(app);
2020

2121
export const App = React.createClass({
2222
propTypes: {
23-
history: PropTypes.object, // eslint-disable-line
23+
history: PropTypes.object // eslint-disable-line
2424
},
2525
render() {
2626
const history = this.props.history || browserHistory;

step-6/readme.md

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,15 @@
22

33
## Pré-requis
44

5+
Vous devez maîtriser les étapes 0, 1, 2, 3, 4 et 5 du workshop afin de pouvoir réaliser l'étape 6.
6+
57
Le code disponible dans cette étape correspond au résultat attendu des étapes 0, 1, 2, 3, 4, et 5.
68

7-
Pour lancer l'application de l'étape 5, exécutez la commande `npm start` (après avoir fait un `npm install`). Ouvrez ensuite l'URL http://localhost:8080 dans votre navigateur. Vous avez également besoin de l'API (lancez la commande `npm start` dans le dossier `api`).
9+
Pour lancer l'application de l'étape 5, exécutez la commande `npm start` (après avoir fait un `npm install`). Ouvrez ensuite l'URL http://localhost:8080 dans votre navigateur.
10+
11+
Dans cette étape, vous allez avoir besoin de l'API. Pour l'exécuter, lancez la commande `npm start` dans le dossier `api`. La documentation de l'API est disponible à l'adresse http://localhost:3000.
12+
13+
Vous avez également la possibilité de lancer les tests de cette étape (que nous avons rédigé pour vous) en utilisant la commande `npm test` afin de voir quelles parties de l'étape fonctionnent et quelles parties ne fonctionnent pas du tout. N'hésitez pas à lire le code des tests afin d'avoir quelques indications en plus sur la façon d'écrire votre application.
814

915
## Objectif
1016

@@ -220,14 +226,20 @@ export const DevTools = createDevTools(
220226

221227
Ce composant va être responsable de l'affichage des devtools dans l'application (Attention ce genre d'outil ne doit être utilisé que dans un environnement de développement).
222228

223-
Une fois le composant fini, il va falloir l'inclure dans l'application (`wine-app.js`)
229+
Une fois le composant fini, il va falloir l'inclure dans l'application (`wine-app.js`). Cependant, comme notre application peut-être lancée dans un environnement de test, nous aimerions que les Devtools ne soient pas utilisés lors des phases de test. En effets, leur utilisation dans l'environnement de test ralentit énormément ces dernier. Nous allons donc tester si nous sommes en environnement de test et si c'est le cas, rendre un composant `null`.
224230

225231
```javascript
226232
import React, { PropTypes } from 'react';
227233
import { GlobalStats } from './stats';
228234
import { connect } from 'react-redux';
229235
import { DevTools } from './devtools';
230236

237+
const NoDevToolsCauseInTestEnv = React.createClass({
238+
render() {
239+
return null;
240+
}
241+
});
242+
231243
const mapStateToProps = (state) => {
232244
return {
233245
...
@@ -244,12 +256,13 @@ export const WineApp = connect(mapStateToProps)(React.createClass({
244256
},
245257

246258
render () {
259+
const Tools = window.TEST ? NoDevToolsCauseInTestEnv : DevTools;
247260
return (
248261
<div>
249262
<div className="grid">
250263
...
251264
</div>
252-
<DevTools />
265+
<Tools />
253266
</div>
254267
);
255268
}
@@ -322,7 +335,7 @@ Editez votre fichier `src/app.js` comme suivant
322335
import React from 'react';
323336
import ReactDOM from 'react-dom';
324337

325-
import { Router, Route, hashHistory, IndexRoute } from 'react-router';
338+
import { Router, Route, browserHistory, IndexRoute } from 'react-router';
326339

327340
import { Provider } from 'react-redux';
328341
import { createStore, applyMiddleware, compose } from 'redux';
@@ -332,19 +345,34 @@ import { app } from './reducers';
332345
import { DevTools } from './components/devtools';
333346

334347
const store = compose(applyMiddleware(thunk), DevTools.instrument())(createStore)(app);
335-
// ici on synchronise le routeur avec le store
336-
const history = syncHistoryWithStore(hashHistory, store);
337348

338349
...
339350

340-
ReactDOM.render(
341-
<Provider store={store}>
342-
<Router history={history}> // et on utilise notre historique synchronisé
343-
...
344-
</Router>
345-
</Provider>
346-
, document.getElementById('main')
347-
);
351+
export const App = React.createClass({
352+
propTypes: {
353+
history: PropTypes.object
354+
},
355+
componentDidMount() {
356+
store.dispatch(fetchLikesCount());
357+
store.dispatch(fetchCommentsCount());
358+
},
359+
render() {
360+
// ici on synchronise le routeur avec le store
361+
const history = syncHistoryWithStore(this.props.history || browserHistory, store);
362+
return (
363+
<Provider store={store}>
364+
<Router history={history}> // et on utilise notre historique synchronisé
365+
<Route path="/" component={WineApp}>
366+
<IndexRoute component={RegionsPage} />
367+
<Route path="regions/:regionId" component={WineListPage} />
368+
<Route path="regions/:regionId/wines/:wineId" component={WinePage} />
369+
<Route path="*" component={NotFound} />
370+
</Route>
371+
</Router>
372+
</Provider>
373+
);
374+
}
375+
});
348376
```
349377

350378
## A vous de jouer !

0 commit comments

Comments
 (0)