2016-12-14 70 views
6

Używam dyrektywy, aby pobrać dane z danych wejściowych używanych jako tekst filtru.Nie można symulować zdarzenia naciśnięcia klawisza w teście Angular 2 (Jasmine)

tutaj jest mój hostlistener w dyrektywie:

@HostListener('input', ['$event.target.value']) 
    public onChangeFilter(event: any): void { 
    console.log('input event fired, value: ' + event); 
    this.columnFiltering.filterString = event; 
    this.filterChanged.emit({filtering: this.columnFiltering}); 
    } 

ten kod działa doskonale, jestem niezdolny do testów jednostkowych samo.

Mam zasubskrybowane filterChanged EventEmitter, w mojej jednostce testowej, aby sprawdzić wartość.

Próbowałem symulować zdarzenie keypress, aby zmienić wartość, a także wypróbowałem atrybut wartości ustawień. Żadne z nich nie działa dla mnie.

tutaj jest mój plik spec:

describe('Table View',() => { 
    let fixture: ComponentFixture<any>; 
    let context: TableComponent; 
    beforeEach(() => { 
    TestBed.configureTestingModule({ 
      providers: [ 
      TableComponent, 
      ], 
      imports: [TableModule], 
     }); 
     fixture = TestBed.createComponent(TableComponent); 
     context = fixture.componentInstance; 
    }); 
it('should allow filter',() => { 
     const element = fixture.nativeElement; 
     context.config = config; 
     fixture.detectChanges(); 

     let tableChangeCount = 0; 
     let tableEvent: any; 
     context.tableChanged.subscribe((event: any) => { 
     tableChangeCount++; 
     tableEvent = event; 
     }); 
     // Check if table exists 
     let inputElement = element.querySelectorAll('tr')[1].querySelector('input'); 
    let e = new KeyboardEvent("keypress", { 
      key: "a", 
      bubbles: true, 
      cancelable: true, 
      }); 
      inputElement.dispatchEvent(e); 
}); 

}); 

Próbowałem wartości ustawień:

let attrs = inputElement.attributes; 
     inputElement.setAttribute('value', 'abc'); 
     for (let i = attrs.length - 1; i >= 0; i--) { 
     // Attribute value is set correctly 
     if (attrs[i].name === 'value') { 
     console.log(attrs[i].name + "->" + attrs[i].value); 
     } 
     } 

Czy ktoś proszę mi pomóc, jak mogę przetestować urządzenie samo?

+0

_ "tutaj jest mój plik spec: "_ ... możesz pokazać test _complete_, abyśmy mogli sprawdzić, co robisz źle. –

+0

dodano pełny test testowy, nie było przycisku kliknij, aby posortować i odświeżyć, działa poprawnie .. m utknął tutaj – Akanksha

+0

Gdzie jest Twoje oczekiwanie? –

Odpowiedz

11

Wystąpiły problemy z symulowaniem naciśnięcia również w teście jednostkowym. Ale natknąłem się na odpowiedź Seyeda Jalala Hosseiniego. To może być to, o co prosisz.

Jeśli próbujesz symulować naciśnięcie klawisza, możesz wywołać zdarzenie, dzwoniąc pod numer dispatchEvent(new Event('keypress'));.

Oto odpowiedź mam na myśli co daje więcej szczegółów: https://stackoverflow.com/a/37956877/4081730

Jeśli chcesz ustawić klucz, który został wciśnięty, można to zrobić również.

const event = new KeyboardEvent("keypress",{ 
    "key": "Enter" 
}); 
el.dispatchEvent(event); 

Dalsze informacje Właśnie natknąć: https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events

1

Jeśli chcesz użyć kodu klucza (lub "co"), można to zrobić:

// @HostListener('document:keypress') 

const escapeEvent: any = document.createEvent('CustomEvent'); 
escapeEvent.which = 27; 
escapeEvent.initEvent('keypress', true, true); 
document.dispatchEvent(escapeEvent);