J'ai un module AMD que je veux tester, mais je veux simuler ses dépendances au lieu de charger les dépendances réelles. J'utilise requirejs et le code de mon module ressemble à ceci:
define(['hurp', 'durp'], function(Hurp, Durp) {
return {
foo: function () {
console.log(Hurp.beans)
},
bar: function () {
console.log(Durp.beans)
}
}
}
Comment puis-je me moquer hurp
et durp
ainsi pouvoir effectuer efficacement un test unitaire?
javascript
unit-testing
mocking
requirejs
Jergason
la source
la source
define
fonction. Il existe cependant quelques options différentes. Je posterai une réponse dans l'espoir qu'elle vous sera utile.Réponses:
Donc, après avoir lu cet article, j'ai trouvé une solution qui utilise la fonction de configuration requirejs pour créer un nouveau contexte pour votre test où vous pouvez simplement vous moquer de vos dépendances:
Cela crée donc un nouveau contexte dans lequel les définitions pour
Hurp
etDurp
seront définies par les objets que vous avez transmis à la fonction. Le Math.random pour le nom est peut-être un peu sale mais cela fonctionne. Parce que si vous avez un tas de tests, vous devez créer un nouveau contexte pour chaque suite pour éviter de réutiliser vos simulacres, ou pour charger des simulacres lorsque vous voulez le vrai module requirejs.Dans votre cas, cela ressemblerait à ceci:
J'utilise donc cette approche en production depuis un moment et c'est vraiment robuste.
la source
createContext
fonction. Donc, dans votre cas, si vous passez uniquement{hurp: 'hurp'}
à la fonction, ledurp
fichier sera chargé comme une dépendance normale.vous voudrez peut-être consulter la nouvelle lib Squire.js
à partir de la documentation:
Squire.js est un injecteur de dépendances pour les utilisateurs de Require.js afin de rendre les dépendances simulées facilement!
la source
J'ai trouvé trois solutions différentes à ce problème, aucune d'elles n'est agréable.
Définition des dépendances en ligne
Fugly. Vous devez encombrer vos tests avec beaucoup de passe-partout AMD.
Chargement de dépendances simulées à partir de différents chemins
Cela implique l'utilisation d'un fichier config.js distinct pour définir des chemins pour chacune des dépendances qui pointent vers des simulations au lieu des dépendances d'origine. C'est également moche, nécessitant la création de tonnes de fichiers de test et de fichiers de configuration.
Fake It In Node
C'est ma solution actuelle, mais elle est toujours terrible.
Vous créez votre propre
define
fonction pour fournir vos propres simulations au module et mettre vos tests dans le callback. Ensuite, vouseval
le module pour exécuter vos tests, comme ceci:C'est ma solution préférée. Cela a l'air un peu magique, mais cela présente quelques avantages.
eval
dans la colère et imaginez Crockford exploser de rage.Il a encore des inconvénients, évidemment.
define
de chaque test, car c'est là que vos tests s'exécutent réellement.Je travaille sur un testeur pour donner une meilleure syntaxe pour ce genre de choses, mais je n'ai toujours pas de bonne solution pour le problème 1.
Conclusion
Mocking deps dans requirejs est nul. J'ai trouvé un moyen qui fonctionne en quelque sorte, mais je ne suis toujours pas très satisfait. Veuillez me faire savoir si vous avez de meilleures idées.
la source
Il existe une
config.map
option http://requirejs.org/docs/api.html#config-map .Comment l'utiliser:
Configurez RequireJS de manière expresse;
Dans ce cas, pour le code normal et le code de test, vous pouvez utiliser le
foo
module qui sera la véritable référence du module et le stub en conséquence.la source
Vous pouvez utiliser testr.js pour simuler des dépendances. Vous pouvez configurer testr pour charger les dépendances fictives au lieu de celles d'origine. Voici un exemple d'utilisation:
Vérifiez également ceci: http://cyberasylum.janithw.com/mocking-requirejs-dependencies-for-unit-testing/
la source
Cette réponse est basée sur la réponse d'Andreas Köberle .
Ce n'était pas si simple pour moi d'implémenter et de comprendre sa solution, je vais donc vous expliquer un peu plus en détail comment cela fonctionne, et quelques écueils à éviter, en espérant que cela aidera les futurs visiteurs.
Donc, tout d'abord la configuration:
j'utilise Karma comme testeur et MochaJs comme cadre de test.
Utiliser quelque chose comme Squire ne fonctionnait pas pour moi, pour une raison quelconque, lorsque je l'ai utilisé, le cadre de test a généré des erreurs:
RequireJs a la possibilité de mapper les identifiants de module à d'autres identifiants de module. Il permet également de créer une
require
fonction qui utilise une configuration différente de celle du globalrequire
.Ces fonctionnalités sont essentielles pour que cette solution fonctionne.
Voici ma version du code fictif, y compris (beaucoup) de commentaires (j'espère que c'est compréhensible). Je l'ai enveloppé dans un module, pour que les tests puissent facilement l'exiger.
Le plus gros piège que j'ai rencontré, qui m'a coûté des heures, a été la création de la configuration RequireJs. J'ai essayé de le copier (en profondeur) et de ne remplacer que les propriétés nécessaires (comme le contexte ou la carte). Cela ne fonctionne pas! Copiez uniquement le
baseUrl
, cela fonctionne très bien.Usage
Pour l'utiliser, exigez-le dans votre test, créez les simulacres, puis transmettez-le à
createMockRequire
. Par exemple:Et voici un exemple de fichier de test complet :
la source
si vous voulez faire des tests js simples qui isolent une unité, vous pouvez simplement utiliser cet extrait de code:
la source