Comment exposer des objets javascript pour les tests unitaires sans polluer l'espace de noms global

J'ai un plugin de remplissage automatique javascript qui utilise les classes suivantes (écrites dans coffeescript): Requête, Suggestion, SuggestionCollection et Autocomplète. Chacune de ces classes a une spécification associée écrite en Jasmine.

Le plugin est défini dans un module, par exemple:

(function(){ // plugin... }).call(this); 

Cela empêche les classes de polluer l'espace de noms global, mais aussi les cache de tous les tests (spécifications avec jasmine, ou tests unitaires avec quelque chose comme q-unit).

Quelle est la meilleure manière d'exposer des classes javascript ou des objets à tester sans polluer l'espace de noms global?

Je répondrai à la solution que j'ai proposée, mais j'espère qu'il y a quelque chose de plus standard.

Mise à jour: ma solution tentée

Parce que je suis un newb avec <100 xp, je ne peux pas répondre à ma propre question pendant 8 heures. Au lieu d'attendre, je vais simplement ajouter ce que j'ai fait ici.

Afin de spécifier ces classes, j'ai inventé un objet global appelé _test que j'ai exposé toutes les classes à tester. Par exemple, dans coffeescript:

 class Query // ... class Suggestion // ... // Use the classes // Expose the classes for testing window._test = { Query: Query Suggestion: Suggestion } 

À l'intérieur de mes spécifications, je peux révéler la classe que je teste:

 Query = window._test.Query describe 'Query', -> // ... 

Cela a l'avantage que seul l'objet _test est pollué, et il est peu probable qu'il se heurte à une autre définition de cet objet. Ce n'est toujours pas aussi propre que je le voudrais. J'espère que quelqu'un fournira une meilleure solution.

Je pense que quelque chose comme le système de module CommonJS (utilisé par brunch , par exemple) fonctionnerait.

Vous pouvez séparer votre code en modules, et les pièces qui en ont besoin les importeraient par le biais de leur require . La seule partie qui est «polluée» est la carte de module maintenue par le code de gestion de module, très similaire à votre objet de test .

Dans Autocomplete.coffee

 class exports.Query // ... class exports.Suggestion // ... 

Et ensuite dans Autocomplete.spec.coffee

 {Query, Suggestion} = require 'app/models/Autocomplete' describe 'Query', ->