1

Ich versuche eine Subject-Änderung in meiner Komponente zu testen, aber die Abdeckung tritt nie in die Subskriptionsfunktion ein.Angular Unit Test Observable/Betreff mit Karma

titlebar-search.component.ts

export class TitlebarSearch implements OnInit { 

    @ViewChild('titleSearchInput') titleSearchInputEl: any; 
    @Input() inputValue: string; 
    @Output() searchText = new EventEmitter<string>(); 
    searchChange: Subject<string> = new Subject<string>(); 


    constructor(private renderer: Renderer) { 

    }  

    /** 
    * Waits a time before send the text to search 
    * 
    * @protected 
    * @memberof TitlebarSearch  
    * 
    */ 
    protected prepareSearchInput() { 
     this.searchChange.debounceTime(500).subscribe(value => { 
      this.searchText.emit(value); 
     }); 
    } 

    /** 
    * Send the text to the searchChange Observable 
    * 
    * @param {string} text 
    * @memberof TitlebarSearch 
    */ 
    public doSubmit(text:string){ 
     this.searchChange.next(text);   
    }  

} 

titlebar-search.component.spec.ts

describe('Titlebar Search tests',() => { 
    let fixture; 
    let titlebarComponent; 

    beforeEach(async(() => { 
     //Creates a UserService using a mock class 
     TestBed.configureTestingModule({ 
      declarations: [TitlebarSearch], 
      imports: [FormsModule], 
      //CUSTOM_ELEMENTS_SCHEMA to solve html elements issues 
      schemas: [ CUSTOM_ELEMENTS_SCHEMA ], 
      providers: [Renderer] 
     }).compileComponents().then(() => { 
      fixture = TestBed.createComponent(TitlebarSearch);    
      titlebarComponent = fixture.componentInstance 
     }); 

    })); 

    //specs 
    it('should send the text to detect the change', async((done) => {   
     const text = "Changed text"; 
     titlebarComponent.doSubmit(text); 
     fixture.detectChanges(); 
     titlebarComponent.searchChange.subscribe(textRecived => { 
      expect(textRecived).toEqual(text); 
      done(); 
     })  
    }));   
}); 

doSubmit Die Methode wird aufgerufen, wenn der Eingabetext gewesen geändert. Dann hat prepareSearchInput eine Subskription für das Subjekt, um die nächste mit Debounce zu erhalten und den gleichen Text auszugeben.

Ich weiß nicht, wo ist der Fehler im Test, aber die Abdeckung decken nie den Abonnement-Code. Die Beispiele über das Internet haben mir nicht geholfen.

Antwort

0

Ich hatte das gleiche Problem, aber bekam die Antwort von @jonrsharpe in diesem Thread: Unit test Angular 2 service subject.

Sie müssen Ihr Subskriptionsabonnement früher in Ihrem Test deklarieren, bevor der next() aufgerufen wird. Wenn Sie es so neu anordnen, sollte es funktionieren:

it('should send the text to detect the change', async((done) => {   
    titlebarComponent.searchChange.subscribe(textRecived => { 
     expect(textRecived).toEqual(text); 
     done(); 
    }) 
    const text = "Changed text"; 
    titlebarComponent.doSubmit(text); 
    fixture.detectChanges(); 
}));  

Das Problem, nach John, war, dass das Motiv kein Wiederholung/Pufferverhalten hat.

Verwandte Themen