2015-03-17 12 views
5

Dalla documentazione gelsomino (http://jasmine.github.io/2.0/introduction.html):gelsomino: scopo di questo

La parola chiave this

Un altro modo per condividere le variabili tra beforeeach, esso, e afterEach è attraverso la parola chiave this. Ogni specifica prima di/dopo/dopo ogni ha lo stesso> oggetto vuoto che è impostato su vuoto per le specifiche successive prima di/dopo/dopo l'utente.

La mia comprensione di questo in Javascript è che questo è limitato allo scopo della funzione effettiva. Quindi mi aspetterei che sarebbe legato al contesto in contesti diversi (quelli che dipendono dalla funzione) all'interno di beforeach/it/afterEach.

ad es.

describe('Spec', function(){ 
    var eachThis = null; 
    beforeEach(function(){ 
    eachThis = this; 
    }); 
    it('check this', function(){ 
    except(this).toEqual(eachThis); 
    } 
}; 

Quindi questo test dovrebbe passare.

Il gelsomino ha cambiato il comportamento di questo o ho sbagliato qualcosa?

risposta

3

penso che il vostro esempio ha forse alcuni problemi, ma lei ha ragione nel pensare che il gelsomino manipola il riferimento this quando si utilizza beforeEach, beforeAll, ecc

Ecco un esempio illustrativo - di notare che tutte le aspetta elencati di seguito passerà:

(function() { 
    describe("without beforeEach", function() { 
    (function() { 
     // this is not inside of a beforeEach call 
     this.dog = "Spot"; 
     alert(this.dog); 
    })(); 
    it("should not have access to a dog property from `this`", function() { 
     expect(this.dog).toBeUndefined(); // because there is no `dog` member of the object currently referenced by `this` 
    }); 
    }); 

    describe("a beforeEach test", function() { 
    beforeEach(function() { 
     this.dog = "Spot"; 
    }); 
    it("should work now because we used `beforeEach`", function() { 
     expect(this.dog).toEqual("Spot"); 
    }); 

    }); 
})(); 

in generale, il vostro pensiero su 'questo' in fase di definizione nell'ambito della funzione è corretta, ma questa implementazione in gelsomino dimostra come è possibile fornire un oggetto specifico a cui fa riferimento il ' questo 'keywo se vuoi. Il modo tipico in javascript è quello di utilizzare Function.prototype.apply() che consente di passare un oggetto arbitrario per il riferimento this come primo parametro della funzione.

+0

Thnx. Conosco il comportamento di applicare. Il punto è che è nascosto qui e il comportamento sembra più tradizionale oop. – Johannes

+0

Immagino che il comportamento sia indicato nei documenti proprio per la ragione che stai suggerendo (che non è ovvio) - Vorrei confrontarlo più da vicino con i delegati in C#, ma sono sicuro che ci sono altri OO esempi simili. Cerco di non fare ipotesi sulla conoscenza di qualcuno che fa una domanda qui, penso solo che la discussione su applicare è utile per la persona casuale che sta cercando informazioni su interwebs :) –

+0

"Questo" funziona tra test asincroni? –

0

Quindi questo test dovrebbe passare.

Sì, e lo fa.

Did gelsomino modificare il comportamento di questo

Non sembra simile.

ho ricevuto qualcosa di sbagliato

Hai errori di sintassi e errori di battitura nel codice (ad esempio except ->expect).


Inoltre, toEqual non prova l'identità di un oggetto, quindi, anche expect(this).toEqual({}); sarebbe passata. toBe è un metodo migliore qui.

+0

Questo "funziona" tra test asincroni? –