2012-08-02 6 views
1

Ma question concerne le test javascript de l'unité utilisant Mocha. En fin de compte, cela peut être une question sur l'injection de dépendance ou l'inversion de contrôle, j'ai une mauvaise compréhension de ces concepts.Code de test unitaire qui utilise Modernizr

J'essaie d'écrire un test qui crée simplement une instance de header.js et teste que c'est un objet. Cependant, chaque fois que je le fais, mon test explose quand il charge Modernizr, avec le message d'erreur suivant. Cela semble se produire parce que Modernizr dépend de l'exécution dans le navigateur, mais mes tests unitaires doivent s'exécuter sur la ligne de commande.

/lib/modernizr.js:8 

"MozAppearance" dans l.style, s = r & & !! b.createRange() compareNode, t = s l:.? N.parentNod ^ TypeError: Impossible de lire la propriété 'parentNode' de définie à /Users/devadmin/devenv/djscript/djscript-vendor/lib/modernizr.js:8:6291

j'ai des modules requirejs qui se trouvent dans la hiérarchie suivante:

lib 
└── pj 
    ├── module 
    │   └── header 
    │    └── header.js 
    ├── util 
    │   └── header 
    │    └── Util.js 
    └── widget 
     └── header 
      ├── Header.js 
      └── view 
       ├── HeaderView.js 
       └── NavView.js 

header.js instancie Header.js, qui à son tour crée un HeaderView et un NavView. Seul HeaderView nécessite Modernizr.

Des conseils sur la façon dont je peux mettre ce code dans un état testable? Serait-il utile de voir comment j'ai emballé Modernizr pour une utilisation avec requirejs?

Répondre

2

bien, je ne l'ai pas utilisé Mocha spécifiquement, mais vous devriez être en mesure de créer un faux exemple Modernizr dans vos tests/harnais en faisant quelque chose comme ...

define(<module path/name - e.g. 'libs/modernizr'>, function(){ 
    return { 
     history: false, 
     foo: true, 
     bar: false 
    }; 
}); 

... avant d'essayer de chargez votre module sous test. Avec cette fausse instance définie, votre module testé devrait utiliser le faux au lieu de la librairie modernizr actuelle.

Vous êtes en train de détourner la fonctionnalité "Module Nommé" d'AMD (lien: http://requirejs.org/docs/api.html#modulename) pour remplacer le réel modernizr par votre faux. De cette façon, vous pouvez tester explicitement les états dont vous avez besoin.

J'espère que ça aide!

+0

semble utile, mon test a été un gros bordel, pourrait descendre cette question tout à fait. – the0ther

Questions connexes