angular2 test, comment se moquer de sous-composant
Comment se moquer de la sous composante jasmin tests?
J'ai MyComponent
, qui utilise MyNavbarComponent
et MyToolbarComponent
import {Component} from 'angular2/core';
import {MyNavbarComponent} from './my-navbar.component';
import {MyToolbarComponent} from './my-toolbar.component';
@Component({
selector: 'my-app',
template: `
<my-toolbar></my-toolbar>
{{foo}}
<my-navbar></my-navbar>
`,
directives: [MyNavbarComponent, MyToolbarComponent]
})
export class MyComponent {}
Quand je l'ai tester ce composant, je ne veux pas charger et tester ces deux sous-composantes; MyNavbarComponent, MyToolbarComponent, j'ai donc envie de s'en moquer.
Je sais comment se moquer avec les services de l'aide provide(MyService, useClass(...))
, mais je n'ai aucune idée de la façon de se moquer de directives; composants;
beforeEach(() => {
setBaseTestProviders(
TEST_BROWSER_PLATFORM_PROVIDERS,
TEST_BROWSER_APPLICATION_PROVIDERS
);
//TODO: want to mock unnecessary directives for this component test
//which are MyNavbarComponent and MyToolbarComponent
})
it('should bind to {{foo}}', injectAsync([TestComponentBuilder], (tcb) => {
return tcb.createAsync(MyComponent).then((fixture) => {
let DOM = fixture.nativeElement;
let myComponent = fixture.componentInstance;
myComponent.foo = 'FOO';
fixture.detectChanges();
expect(DOM.innerHTML).toMatch('FOO');
});
});
Voici mon plunker exemple;
http://plnkr.co/edit/q1l1y8?p=preview
- Les composants fonctionnent très bien, votre question est une autre chose. Vous êtes à l'importation, par exemple,
MyNavbarComponent
mais dans votre classe de composant est appelémyNavbarComponent
. Remarque les minusculesm
, qui le fait échouer. Si vous en majuscules, il pourra fonctionner correctement. - merci @EricMartinez, je fixe les minuscules et le test fonctionne. Cependant ma question est toujours valable avec la façon de se moquer d'un composant. Je suis en train de tester
MyComponent
, pasMyNavbarComponent
niMyToolbarComponent
- Oui, je suis désolé. Vous pouvez prendre un coup d'oeil à cette spec et de voir comment ils se moquent de la composante.
- merci. J'ai posté ma propre réponse appris de vos commnet. Tout le crédit va à vous.
Vous devez vous connecter pour publier un commentaire.
Comme demandé, je poste une autre réponse sur la façon de se moquer de sous-composants avec
input
/output
:Permet donc de commencer par dire que nous avons
TaskListComponent
qui affiche les tâches, et actualise à chaque fois que l'un d'eux est cliqué:app-task
est un sous-composant avec la[task]
d'entrée et de la(click)
de sortie.Ok super, maintenant nous voulons écrire des tests pour mon
TaskListComponent
et bien sûr, nous ne voulons pas de test de la vraieapp-task
composant.afin @Klas a suggéré que nous pouvons configurer notre
TestModule
avec:On pourrait pas faire des erreurs lors de la construction ou de l'exécution, mais nous ne serons pas en mesure de tester beaucoup d'autres que l'existence de la sous-composant.
Alors, comment peut-on se moquer de sous-composants?
Nous allons d'abord définir un simulacre de la directive pour notre sous-composant (même sélecteur):
Maintenant, nous allons déclarer dans le module de test:
Lors de nos tests, nous pouvons maintenant nous interroger pour la directive, d'accéder à ses DebugElement de l'injecteur, et profitez de notre maquette directive exemple à travers elle:
[Cette partie doit être habituellement
beforeEach
section, pour nettoyeur de code.]À partir d'ici, les tests sont un morceau de gâteau 🙂
fixture.detectChanges()
est appelé. Mon application sous-élément de données n'était fixé sur un appel de méthode dans le but d'obtenir cet exemple de travail pour moi, j'ai dû appeler la méthode sur l'appareil et appelez ensuitedetectChanges()
pour que cela fonctionne.import { By } from '@angular/platform-browser';
a fonctionné pour moi.@ViewChild('my-sub-component')
fonctionne si vous avez#my-sub-component
comme un attribut de la sous-composante.Si vous utilisez
schemas: [CUSTOM_ELEMENTS_SCHEMA]
dansTestBed
le composant sous test ne prendra pas en charge les sous-composants.Cela fonctionne dans la version de Angular 2.0.
Exemple de code complet ici.
Une alternative à
CUSTOM_ELEMENTS_SCHEMA
estNO_ERRORS_SCHEMA
fixture.debugElement.query(By.directive(MockSubComponent)).injector.get(MockSubComponent)
. Cheers!Merci à Eric Martinez, j'ai trouvé cette solution.
Nous pouvons utiliser
overrideDirective
fonction qui est documenté ici,https://angular.io/docs/ts/latest/api/testing/TestComponentBuilder-class.html
Il faut trois prarmeters;
1. Composant à mettre en œuvre
2. Enfant composant à remplacer
3. Maquette composant
Résolu solution est ici, à http://plnkr.co/edit/a71wxC?p=preview
C'est l'exemple de code à partir de la plunker
@Component
annotation? Vous pouvez poster votre karma.conf? Je reçois[preprocessor.babel]: Unexpected token
sur cette ligneTestBed
?TestComponentBuilder
est toutefois déconseillé de la nouvelleTestBed. overrideDirective
permettent seulement de remplacer les métadonnéesJ'ai mis en place un simple
MockComponent
module pour aider à rendre cela un peu plus facile:Il est disponible à l'
https://www.npmjs.com/package/ng2-mock-component.
@ViewChild(SubComponent) sc; sc.callFn()
. Composante de l'injecteur ne reconnaîtra pasSubComponent
avec votre maquette de remplacement et retourne toujours null. Une solution est de balise, mais le marquage de l'habitude de travailler avec@ContentChild
ou dynamique, les sous-composants :/