2013-06-15 14 views
8

mio oggetto servizio simile a questa:gelsomino spiare oggetto nidificato

var appService = { 
serviceOne: { 
    get: function(){} 
}, 
serviceTwo: { 
    query: function(){} 
} 
} 

vorrei prendere in giro appService, qualcosa di simile:

expect(appService.serviceTwo.query).toHaveBeenCalled(); 

Come potrei fare per farlo?

+0

Devi accettare una risposta. Ci sono 2 qui che funzionano – jolySoft

risposta

7

OK ho ottenuto questo lavorare con questo:

appService: { 
    serviceOne: jasmine.createSpyObj('serviceOne', ['get']), 
    serviceTwo: jasmine.createSpyObj('serviceTwo', ['query']) 
} 

spero che sia il modo giusto per farlo.

+1

Questo è l'approccio ottimale. In esso, sia "get" che "query" sono metodi di spionaggio. Quindi, qualcosa come 'expect (appService.serviceTwo.query) .toHaveBeenCalled()' è disponibile. – acdcjunior

6

Basta sostituire la funzione con spie di gelsomino:

var appService = { 
    serviceOne: { 
    get: jasmine.createSpy() 
    }, 
    serviceTwo: { 
    query: jasmine.createSpy() 
    } 
} 

seguito:

expect(appService.serviceTwo.query).toHaveBeenCalled() 
+1

E se volessi 'spyOn' invece di farlo - è possibile? –

2

mi sono imbattuto in un problema molto simile e ottenuto una soluzione di lavoro che consente di spionaggio a più livelli in modo relativamente facile .

appService = { 
    serviceOne: jasmine.createSpy().and.returnValue({ 
    get: jasmine.createSpy() 
    }, 
    serviceTwo: jasmine.createSpy().and.returnValue({ 
    query: jasmine.createSpy() 
    } 
} 

Questa soluzione consente il codice seguente per essere messa in un test di unità

expect(appService.serviceOne).toHaveBeenCalledWith('foobar'); 
expect(appService.serviceOne().get).toHaveBeenCalledWith('some', 'params'); 

Nota: questo codice non è stato testato; tuttavia, ho un'implementazione molto simile in una delle mie app. Spero che questo ti aiuti!

Problemi correlati