2016-06-27 9 views
2

Ich arbeite an einer Angular 2-rc3-Anwendung und ich habe einige Untestests eingerichtet und sie arbeiten, yay! Ich verstehe einfach nicht, warum sie so geschrieben werden müssen, wie sie es tun. Und noch erstaunlicher, alltheexamplesIsee haben den gleichen Ansatz. Insbesondere sind diese Fragen auf der Spitze meiner Liste:Using Angular 2 TestComponentBuilder verwirrt mich

  1. Warum ist die TestComponentBuilder in jedem Unittest konfiguriert?

    it('shows list of blog items by default', inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { 
        return tcb 
        .overrideProviders(BlogRoll, [provide(BlogService, { 
          useValue: mockBlogService 
         })]) 
         .createAsync(BlogRoll) 
         .then((fixture) => { 
         // actual test code 
        }); 
    }); 
    

    Das ist schon sieben Zeilen Code extra pro Unittest und die Lesbarkeit meines Codes leidet viel von diesem. Ich habe versucht, setze diese in einem beforeEach():

    beforeEach(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { 
        console.log('beforeEach'); 
        return tcb.overrideProviders(BlogRoll, [provide(BlogService, { 
          useValue: mockBlogService 
         })]) 
         .createAsync(BlogRoll) 
         .then(fixture => { 
          // this never gets printed 
          console.log('in then:', fixture.componentInstance); 
         }); 
    })); 
    

    aber Karma scheint nicht in der Lage zu sein, den asyncness zu handhaben, alles in den then einfach nicht ausgeführt werden soll. Ist das ein Fehler oder ist das beabsichtigt, sollen wir es nicht so machen?

  2. Warum muss die Erstellung dieser Komponente asynchron erfolgen? Es gibt eine createSync() auf der TestComponentBuilder class, können wir das nicht verwenden? Natürlich habe ich es ausprobiert und festgestellt, dass sich die Funktionssignaturen unterscheiden: createAsync(rootComponentType: Type) : Promise<ComponentFixture<any>> und createSync(componentFactory: ComponentFactory<C>) : ComponentFixture<C>. Warum brauchen wir hier eine Komponentenfabrik? Warum brauchen wir sie nicht, wenn wir die Komponente async erstellen? // Update: RC4 ist out und createSync() akzeptiert jetzt einen Typ. Groß.

Meine Vernunft danke Ihnen schon!

+0

Update: Das Changelog für RC4 enthält diese brechende Änderung: 'Compiler: TestComponentBuilder.createSync nimmt jetzt einen Komponententyp und löst aus, wenn nicht alle Templates inline sind, die zuvor über createAsync kompiliert wurden. –

Antwort

3

Angular 2 endgültig wurde versandt und die TestComponentBuilder Klasse wurde durch die TestBed ersetzt worden, was mich weniger eine ganze Menge verwirrt.

+0

Hier sind die [Dokumente] (https://angular-2-training-book.angle.io/handout/testing/components/overriding.html) – genuinefafa

1
  1. Die angular2-material Tests sind gut organisiert, und das Setup TestComponentBuilder im beforEach, obwohl sie nach wie vor createAsync für jeden Test rufen Sie. Sie können dann Nest der createAsync Aufruf wie folgt:

    describe('Example',() => { 
         let fixture; 
         let builder: TestComponentBuilder; 
    
         beforeEach(injectAsync([TestComponentBuilder], (tcb: TestComponentBuilder) => { 
           builder = tcb; 
    
           builder.createAsync(ExampleComponent).then(  
            fixture = f; 
           }); 
         }); 
    
    
         it('Test 1',() => { 
            expect(fixture.componentInstance).not.toEqual(null); 
         }); 
    }); 
    
+0

Haben Sie diesen Code getestet? Ihr 'then' enthält einen Syntaxfehler (' f => {'fehlt). Ein großer Unterschied zu meinem Code ist, dass Sie 'injectAsync()' verwenden, was ich noch nicht ausprobiert habe, aber leider sind auf meinem Rechner die Ergebnisse gleich und das 'then' wird nicht ausgeführt. Wird es mit dir ausgeführt? –

+0

Halten Sie das Telefon! Ich erhalte einen tatsächlichen Fehler: 'Keine Direktive auf MyPipe gefunden. Keine Ahnung warum. Meine Anwendung funktioniert, aber mein Test kann meine Pipe nicht finden? Der Test befindet sich im selben Verzeichnis wie meine Pipe, 'importiere {MyPipe} von './my.pipe';' ist korrekt ... Seltsam. –