2017-10-18 10 views
1

Disons que j'ai un composant comme ce qui suit:angulaire: test de l'unité que la production d'un composant n'est pas émis

@Component({ 
    selector: 'example', 
    template: ` ` 
}) 
export class ExampleComponent { 
    value: any; 
    @Output() output: EventEmitter<any> = new EventEmitter(); 

    onValueChange(newValue: any) { 
    if (newValue !== this.value) { 
     this.value = newValue; 
     this.output.emit(newValue); 
    } 
    } 
} 

J'ai écrit un test comme celui ci-dessous. Je veux tester que si onValueChange est appelé avec la même valeur que value, le composant ne produira pas la valeur en double. Existe-t-il une meilleure pratique pour les tests unitaires qu'un abonnement observable n'est jamais appelé? Alors que ce que j'ai fait techniquement fonctionne, c'est un peu hacky.

describe('ExampleComponent',() => { 
    it('should not output duplicate values',() => { 
    const component = new ExampleComponent(); 
    component.value = 1; 
    component.output.subscribe(value => { 
     // if the output is not triggered then we'll never reach this 
     // point and the test will pass 
     expect(true).toEqual(false); 
    }); 
    component.onValueChange(1); 
    }); 
}); 

Répondre

2

Vous pouvez utiliser un espion comme ceci:

describe('ExampleComponent',() => { 
    it('should not output duplicate values',() => { 
    const component = new ExampleComponent();   
    spyOn(component.output, 'emit'); 

    component.value = 1; 
    component.onValueChange(1); 

    expect(component.output.emit).not.toHaveBeenCalled(); 
    }); 
}); 
0

Voilà à peu près comment vous le faites. Une variante est:

describe('ExampleComponent',() => { 
    it('should not output duplicate values',() => { 
    const component = new ExampleComponent(); 
    let numEvents = 0; 
    component.value = 1; 
    component.output.subscribe(value => ++numEvents); 
    component.onValueChange(1); 
    expect(numEvents).toEqual(0); 
    }); 
});