2014-09-05 12 views
6

Voglio spiare una funzione di costruzione e dire quante volte è stata chiamata usando il gelsomino. Mi piacerebbe solito fare qualcosa di simile per indirizzare un metodo di un oggetto:Spiare un costruttore usando il gelsomino

spyOn(lib,'methodName') 

ma nel caso che sto cercando di spiare costruttore actualy così ho provato:

spyOn(lib); 


it('lib should be instantiated for each matching element', function() { 
    spyOn(lib); 
    expect(lib.calls.count()).toEqual(2); 
}); 

Purtroppo questo mi dà solo un errore nella console:

"Error: undefined() method does not exist in ..." 

come posso spiare il costruttore?

+2

Prova con 'spyOn (finestra, 'lib')' – javiyu

+0

usa 'lib.callCount' – inf3rno

+0

possibile duplicato di [Jasmine - Spionaggio su una chiamata di metodo all'interno di un costruttore] (http://stackoverflow.com/questions/8733978/jasmine-spying-on-a-method-call-within-a-constructor) –

risposta

11

La funzione spyOn() può solo sostituire le proprietà dell'oggetto, quindi l'unica cosa che si può fare è spiare il prototipo. Ora se si spiare il prototipo della classe reale, interferirebbe con gli altri test, quindi è necessario utilizzare l'ereditarietà prototipale.

si può fare qualcosa di simile:

var mockClass = function (Subject) { 
    var Surrogate = function() { 
     Surrogate.prototype.constructor.apply(this, arguments); 
    }; 
    Surrogate.prototype = Object.create(Subject.prototype); 
    Surrogate.prototype.constructor = Subject; 
    return Surrogate; 
}; 

Alcuni test:

var My = function (a) { 
    this.init(a); 
}; 
My.prototype = { 
    init: function (a) { 
     this.setA(a); 
    }, 
    setA: function (a) { 
     this.a = a; 
    } 
}; 

var Mock = mockClass(My); 
spyOn(Mock.prototype, "constructor").andCallThrough(); 
spyOn(Mock.prototype, "init"); 

var m = new Mock(1); 

expect(Mock.prototype.init).toBe(m.init); 
expect(My.prototype.init).not.toBe(m.init); 
expect(m.constructor).toHaveBeenCalledWith(1); 
expect(m.init).toHaveBeenCalledWith(1); 
expect(m.a).toBeUndefined(); 
m.setA(1); 
expect(m.a).toBe(1); 

spyOn(Mock.prototype, "setA").andCallFake(function (a) { 
    this.a = a + 1; 
}); 
m.setA(1); 
expect(m.setA).toHaveBeenCalledWith(1); 
expect(m.a).toBe(2); 

Non si può spiare il constructor se il codice utilizza un tipo di controllo basato x.constructor. Ma penso che questo possa accadere solo con i test di integrazione e con codici mal progettati ...

Problemi correlati