2017-10-18 3 views
0

Je dois trouver le moyen de changer la valeur userAgent. J'ai essayé de spyOn le window.navigator.userAgent. Mais ça n'aide pas.Jasmine.js Testing - espionner window.navigator.userAgent

JS:

@Injectable() 
export class DetectBrowserService { 
    browserIE: boolean; 
    constructor() { 
    this.browserIE = this.detectExplorer(); 
    } 

    public detectExplorer() { 
    const brows = window.navigator.userAgent; 
    const msie = brows.indexOf('MSIE '); 
    if (msie > 0) { 
     // IE 10 or older => return version number 
     return true; 
    } 
    } 
} 

Spec:

it('should test window.navigator.userAgent',() => { 
    const wind = jasmine.createSpy('window.navigator.userAgent'); 
    wind.and.returnValue('1111'); 
    detectBrowserService = TestBed.get(DetectBrowserService); 
    console.log(window.navigator.userAgent); 
}); 

Je me attendais 1111, mais on m'a donné la vraie information au sujet de mon navigateur.

+1

Je recommande d'encapsuler les appels api natifs dans des fonctions restreintes (comme dans http://www.adequatelygood.com/Writing-Testable-JavaScript.html), et d'espionner ces fonctions à la place des API natives. S'appuyer sur des fonctions strictes rend votre code plus portable (rendu côté serveur, problèmes de navigateur multiples, etc.) et testable. J'ai toujours eu de la difficulté à espionner les api de fenêtres indigènes avec du jasmin. – Sergeon

Répondre

2

userAgent est une propriété en lecture seule/constante sur window.navigator. Et jasmine.createSpy est généralement utilisé pour créer des espions sur les méthodes et non sur les propriétés.

Maintenant, j'ai essayé de faire directement window.navigator.userAgent = '1111'; comme window.navigator serait simplement accessible dans mes tests. Mais je devenais un dicton d'erreur:

[ts] Cannot assign to 'userAgent' because it is a constant or a read-only property. (property) NavigatorID.userAgent: string

enter image description here

La seule option était d'utiliser le bon vieux __defineGetter__. Donc, c'est ce que je faisais ici:

it('should test window.navigator.userAgent',() => { 
    window.navigator['__defineGetter__']('userAgent', function(){ 
    return '1111' // Return whatever you want here 
    }); 
    detectBrowserService = TestBed.get(DetectBrowserService); 
    console.log(window.navigator.userAgent); 
}); 

Et ça marche: enter image description here

Hope this helps!