Comment se moquer des variables globales (définir, de module, de fenêtre) en moka tests?
Dans la poursuite de 100% de couverture de code, j'essaie d'utiliser moka pour tester que mon javascript module de chargement est correctement sous AMD
, CommonJS/Node
, et browser
conditions. Le modèle que j'utilise est ci-dessous:
my-module.js
(function(global){
function MyClass(){}
//AMD
if(typeof define === 'function' && define.amd){
define(function(){
return MyClass;
});
//CommonJS/Node
} else if (typeof module !== 'undefined' && module.exports){
module.exports = MyClass;
//Browser
} else {
global.MyClass = MyClass;
}
})(this);
Depuis que je suis en cours d'exécution mes tests avec le noeud, define
n'est jamais défini, et module
est toujours défini; de sorte que le "CommonJS/Node" est le seul qui n'est jamais testé.
Ce que j'ai essayé jusqu'à présent est quelque chose comme ceci:
my-module.test.js
var MyClass = require('./my-module');
describe('MyClass', function(){
//suite of tests for the class itself
//uses 'var instance = new MyClass();' in each test
//all of these tests pass
});
describe('Exports', function(){
//suite of tests for the export portion
beforeEach(function(){
MyClass = null; //will reload module for each test
define = null; //set 'define' to null
module = null; //set 'module' to null
});
//tests for AMD
describe('AMD', function(){
it('should have loaded as AMD module', function(){
var define = function(){};
define.amd = true;
MyClass = require('./my-module'); //might be cached?
//hoping this reloads with 'define' in its parent scope
//but it does not. AMD condition is never reached.
expect(spy).to.have.been.called(); //chai spy, code omitted
});
});
});
Je suis en utilisant des espions pour vérifier si define
a été appelé, mais le module ne montrent aucun signe d'être rechargé avec define
disponibles. Comment puis-je y parvenir?
Et est-il un moyen sûr de détruire module
afin que je puisse tester le navigateur condition?
OriginalL'auteur SteamDev | 2015-02-05
Vous devez vous connecter pour publier un commentaire.
Vous voudrez peut-être consulter le rewire module. Je ne suis pas sûr à 100%, mais je pense que ça va vous permettre de faire ce dont vous avez besoin.
https://github.com/jhnns/rewire
Utile module, mais pas de cigare dans cette situation particulière. Je pense que c'est peut-être parce que j'ai besoin de la globals disponible à l'emballage des IIFE, et non pas l'exportation de la classe elle-même.
OriginalL'auteur Kevin Ennis
J'ai été en mesure de créer une solution personnalisée (emprunt à la majorité de ce code,http://howtonode.org/testing-private-state-and-mocking-deps)
module-loader.js
Ce module fondamentalement crée un nouveau contexte dans lequel les propriétés personnalisées sont disponibles dans le même espace mondial comme
require
etconsole
, etc.my-module.test.js
my-module.js
OriginalL'auteur SteamDev
Voici une solution légère qui a fonctionné pour moi:
Malheureusement, cela doit aller dans le fichier mis à l'essai, serait lourd pour les cas où plus de
document
's de la fonction, et n'aide pas à avoir besoin de tester les cas où quelque chose n'est pas défini. Mais pour les cas les plus simples, voici une solution simple.(C'est la réponse que je cherchais quand j'ai trouvé cette question)
OriginalL'auteur ShadSterling