Les Tests unitaires/se moquant de la Fenêtre de propriétés dans Angular2 (Tapuscrit)
Je suis en train de construire quelques tests unitaires pour un service en Angular2.
Au sein de mon Service, j'ai le code suivant:
var hash: string;
hash = this.window.location.hash;
Cependant lorsque je lance un test qui contient ce code, il ne sera pas.
Ce serait super de pouvoir utiliser toutes les fonctionnalités de la Fenêtre, mais comme je suis en utilisant PhantomJs, je ne pense pas que ce soit possible (j'ai aussi essayé de Chrome qui donne les mêmes résultats).
Dans AngularJs, j'aurais eu recours à des moqueries $de la Fenêtre (ou au moins les propriétés en question), mais comme il n'y a pas beaucoup de documentation pour Angular2 tests unitaires, je ne suis pas sûr de la façon de le faire.
Peut aider quelqu'un?
OriginalL'auteur Rhys | 2016-04-12
Vous devez vous connecter pour publier un commentaire.
Angulaire 2 vous pouvez utiliser la
@Inject()
fonction d'injecter de la fenêtre de l'objet en le nommant à l'aide d'une chaîne de jeton, à l'instar de ceDans le
@NgModule
vous devez ensuite fournir à l'aide de la même chaîne:Alors vous pouvez aussi simuler à l'aide de la chaîne de jeton
Cette travaillé dans Angulaire 2.1.1, plus tard 2016-10-28.
Ne fonctionne pas avec Angulaire 4.0.0 AOT.
https://github.com/angular/angular/issues/15640
A essayé avec un AoT construire (avec tapant
window
commeany
à l'intérieur du constructeur de travail autour d'un bug), mais ma production de construire s'est écrasé quand j'ai essayé d'accéder à une propriété personnalisée surwindow
que je suis dans un autre fichier. J'ai suivi la solution ici au lieu de cela, et cela a fonctionné: stackoverflow.com/a/37176929/1683187OriginalL'auteur Klas Mellbourn
@Estus mentionnées dans le commentaire, vous seriez mieux d'obtenir le hash à partir du Routeur. Mais pour répondre directement à votre question, vous avez besoin d'injecter de la fenêtre à l'endroit où vous l'utilisez, ainsi que pendant les tests, vous pouvez vous moquer.
D'abord, le registre de fenêtre avec la angular2 fournisseur probablement quelque part globale si vous utilisez ce tout plus de l'endroit:
Cela dit angulaire lors de l'injection de dépendance demande pour le type
Window
, il doit retourner le mondialwindow
.Maintenant, dans l'endroit où vous l'utilisez, vous injectez dans votre classe au lieu d'utiliser le global directement:
Vous êtes maintenant prêt à se moquer de cette valeur dans votre test.
constructor(window:Window)
et fournir commeprovide(Window, {useValue: window})
ouprovide(Window, {useClass: MyWindowMock})
. Pas besoin d'utiliser une chaîne de clé si il y a un type disponible.fournir retiré dans RC6 de base, modifier les
providers: [ {provide: Window, useValue: window}, ]
OriginalL'auteur elwyn
Après RC4 méthode
provide()
son depracated, de sorte que la façon de gérer cette après RC4 est:Il me prendre un certain temps pour comprendre comment il fonctionne.
OriginalL'auteur ulou