2012-06-02 13 views
20

Come parte dei miei test di unità (usando QUnit) per un progetto backbone, provo alcune funzioni di manipolazione delle raccolte che restituiscono array di modelli di backbone.C'è un modo per verificare se un oggetto "è un" Backbone.Model nei miei test di unità?

C'è un modo per testare direttamente (per motivi di sanità mentale) se gli oggetti nel mio array estendono Backbone.Model o dovrei semplicemente fare un controllo di tipo duck (e se sì, come, e su quale attributo univoco, per esempio)?

Poiché non esiste un vero costrutto "Classe" in javascript, lo typeof ovviamente non farà il trucco qui.

ho potuto vedere questo essere utile in altri test lungo la strada per le mie collezioni, o per controllare che le cose sono istanze di miei specifiche classi di backbone, ecc

risposta

33

Come sull'utilizzo instanceof:

console.log(yourObject instanceof Backbone.Model); 

L'operatore instanceof verifica se un oggetto ha nel suo prototipo la proprietà prototipo di un costruttore.

+0

Freddo. non l'avevo ancora imparato. Grazie! –

+0

@ Ben: Prego – Sarfraz

2

Un controllo contro il tipo di un oggetto è un odore di codice in lingue come JavaScript.

Se è necessario sapere che la raccolta restituisce un modello specifico quando si chiama un metodo specifico, compilare la raccolta con modelli noti e effettuare il confronto con tali modelli.

MyModel = Backbone.Model.extend({}); 

MyCollection = Backbone.Collection.extend({ 
    model: MyModel, 

    getThatOne: function(){ 
    return this.at[0]; 
    } 
}); 


m1 = new MyModel(); 
m2 = new MyModel(); 

col = new MyCollection([m1, m2]); 

retrieved = col.getThatOne(); 

retrieved === m1 //=> true 
+0

Grazie per aver risposto, Derick! I tuoi articoli su Los Techies sono stati davvero utili. Mi rendo conto che il controllo dei tipi è sgradevole in qualsiasi linguaggio dinamico, ma occasionalmente faccio un'eccezione durante la scrittura dei test, ma suppongo che probabilmente dovrei evitarlo anche lì, quando possibile. –

Problemi correlati