【问题标题】:How to test Click outside directive in angular?如何以角度测试点击外部指令?
【发布时间】:2019-04-24 08:41:12
【问题描述】:

我想测试点击外部指令。扩展是我在点击外部时忽略 div 元素。

import { Directive, ElementRef, Output, EventEmitter, HostListener } from 
'@angular/core';

@Directive({
  selector: '[clickOutside]'
})
export class ClickOutsideDirective {
constructor(private _elementRef: ElementRef) {
}

@Output()
public clickOutside = new EventEmitter<HTMLElement>();

@HostListener('document:click', ['$event.target'])
public onClick(targetElement: HTMLElement) {
    const clickedInside = this._elementRef.nativeElement.contains(targetElement);
    const doctorDropdown = document.getElementById('doctor-dropdown-list');
    if (!clickedInside && !doctorDropdown.contains(targetElement)) {
        this.clickOutside.emit(targetElement);
    }
}

}

我无法测试这部分!

@HostListener('document:click', ['$event.target'])
public onClick(targetElement: HTMLElement) {
    const clickedInside = this._elementRef.nativeElement.contains(targetElement);
    const doctorDropdown = document.getElementById('doctor-dropdown-list');
    if (!clickedInside && !doctorDropdown.contains(targetElement)) {
        this.clickOutside.emit(targetElement);
    }

【问题讨论】:

    标签: angular karma-jasmine angular2-directives angular-test


    【解决方案1】:
    import { Component, DebugElement } from '@angular/core';
    import { ComponentFixture, TestBed } from '@angular/core/testing';
    import { ClickOutsideDirective } from '../click-outside.directive';
    import { By } from '@angular/platform-browser';
    
    @Component({
        template: `
        <div class="inside" (clickOutside)="clickOutside()"></div> // or doctor-dropdown-list
        <div class="outside"></div>
      `
    })
    class TestComponent {
        clickOutside(): void{}
    }
    
    describe('ClickOutsideDirective', () => {
        let fixture: ComponentFixture<TestComponent>;
        let component: TestComponent;
        let element: DebugElement;
    
        beforeEach(async () => {
            await TestBed.configureTestingModule({
                declarations: [ClickOutsideDirective, TestComponent],
            }).compileComponents();
    
            fixture = TestBed.createComponent(TestComponent);
            component = fixture.componentInstance;
        });
    
        it('should create directive', () => {
            fixture.detectChanges();
    
            expect(component).toBeTruthy();
        });
    
        it('should trigger click inside', () => {
            spyOn(component, 'clickOutside');    
            fixture.detectChanges();
    
            const inside = fixture.debugElement.query(By.css('.inside')).nativeElement;
            inside.click();
    
            expect(component.clickOutside).not.toHaveBeenCalled();
        });
    
        it('should trigger click outside', () => {
            spyOn(component, 'clickOutside');
            fixture.detectChanges();
    
            const outside = fixture.debugElement.query(By.css('.outside')).nativeElement;
            outside.click();
    
            expect(component.clickOutside).toHaveBeenCalled();
        });
    });
    

    【讨论】:

    • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
    猜你喜欢
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    相关资源
    最近更新 更多