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