Angular + Jasmine: тестирование вывода дочернего компонента с помощью spyOn

Я внедряю набор тестов (Karma+Jasmine) в наше приложение Angular, но у меня возникают проблемы с этим конкретным случаем.

Допустим, мне нужно протестировать компонент с именем MessageComponent, который генерирует событие, нажимающее кнопку. Как я могу убедиться, что событие генерируется правильно, если я проверяю его от родителя?

Вот пример:

@Component( {
    selector: "cw-message",
    template: `
    <div #messageElement>
        {{message.title}}
        <button class="close icon" (click)="close($event, messageElement)">Close</button>
    </div>`
} )
class MessageComponent {

    @Input() message;
    @Output() onClose:EventEmitter<boolean> = new EventEmitter();

    public close( event:Event, element:HTMLElement ):void {
        this.onClose.emit( true );
    }
}

Имея такой компонент, я пытаюсь проверить его, используя следующий код:

describe( "MessageComponent", () => {

    let comp:TestComponent;
    let fixture:ComponentFixture<TestComponent>;
    let de:DebugElement;

    @Component( {
        template: `
        <div>
            <cw-message class="first" [message]="message"></cw-message>
        </div>`
    } )
    class TestComponent {

        @ViewChild( MessageComponent ) messageComponent:MessageComponent;
        public message = {
            title: "My message",
            content: "The content of the message",
            duration: 1000,
        };

        ngAfterViewInit() {};

        ngAfterContentInit() {};

        ngAfterViewChecked() {}

        ngAfterContentChecked() {};
    }


    beforeEach( async( () => {
        TestBed.configureTestingModule( {
            imports: [ FormsModule ],
            declarations: [ TestComponent, MessageComponent, ],
        } ).compileComponents();
    } ) );

    beforeEach( () => {
        fixture = TestBed.createComponent( TestComponent );
        comp = fixture.componentInstance;
        de = fixture.debugElement;
        fixture.detectChanges();
    } );

    fit( "Should close message", () => {

        spyOn( comp.messageComponent, "close" );
        spyOn( comp.messageComponent.onClose, "emit" );
        let messageDiv:HTMLElement = fixture.nativeElement.querySelector( ".message" );
        let closeBtn = fixture.nativeElement.querySelector( ".close.icon" );

        closeBtn.click();

        expect( comp.messageComponent.onClose.emit ).toHaveBeenCalledWith( true );
    } );

} );

Но я всегда получаю следующее исключение:

Expected spy emit to have been called with [ true ] but it was never called.

И это заставляет меня задуматься... возможно ли тестировать дочерние компоненты таким образом? Что я делаю неправильно?

1 ответ

Вам нужно вызвать fixture.detectChanges(); после вызова метода щелчка.

Другие вопросы по тегам