Intro:
ho qualche codice legacy che crea un singleton:Crea nuova istanza di Singleton
define(['backbone', 'MyModel'], function (Backbone, MyModel) {
var MyCollection = Backbone.Collection.extend({
model: MyModel,
initialize: function() {
//...
}
});
return new MyCollection();
});
E per scopi di test ho bisogno di generare nuove istanze di iniettare loro come dependeces.
Domanda:
Esiste un modo per generare nuove istanze del Singleton senza modificare il codice originale?
quello che ho fatto:
sono venuto con una soluzione: aggiungere la classe come una proprietà della instace
initialize: function() {
this.ClassObject = MyCollection;
//...
}
e quindi un'istanza
var myCollection = require('myCollection');
var myCollectionInstance = new myCollection.ClassObject();
Questa soluzione modifica la classe e mi piacerebbe evitarlo.
Ho anche provato la creazione di una copia del Singleton:
function generateNewCollection() {
var F = function() {};
F.prototype = myCollection;
return new F();
}
Esso genera una nuova istanza, ma non crea nuove istanze di sue dipendenze, quindi l'ambiente è ancora sporco per i prossimi test.
Grazie per la risposta! Ma cercherò di evitare di modificare il codice originale del modulo, e il miglioramento che intendi è quello che sta causando i miei problemi: 'return new MyCollection();'. Mi piacerebbe avere una classe con un metodo 'getInstance' invece che solo l'istanza. Con ciò ho potuto ottenere l'istanza, generare nuove istanze con la classe o modificare il metodo 'getInstance' per restituire nuove istanze in modo che in tutti i test ci siano nuove istanze senza iniezione. E per favore, cerca di non usare la coffe-script quando hai una domanda javascript. – Kaizo
-1 per rispondere in CoffeeScript. – Mathletics
Haha. CoffeeScript è il futuro, ya'll. Ho sprecato troppo della mia carriera in Javascript senza usarlo. È ora di salire a bordo. – SimplGy