1
我想單元測試一個具有Input參數的自定義maxlength指令。該指令的樣子:單元測試Angular 2中的屬性指令
import { Directive, Input, HostListener } from '@angular/core';
@Directive({
selector: '[limitTo]'
})
export class LimitToDirective {
@Input() limit: number;
constructor() {
}
@HostListener("keypress", ["$event"])
onkeypress(event) {
if (event.target.value.length === this.limit) {
event.preventDefault();
}
}
}
單元測試看起來像:
@Component({
template: `<input type="text" limit="8"
limitTo>`
})
class TestMaxLengthComponent {
}
describe('Directive: LimitToDirective',() => {
let component: TestMaxLengthComponent;
let fixture: ComponentFixture<TestMaxLengthComponent>;
let inputEl: DebugElement;
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [TestMaxLengthComponent, LimitToDirective]
});
fixture = TestBed.createComponent(TestMaxLengthComponent);
component = fixture.componentInstance;
inputEl = fixture.debugElement.query(By.css('input'));
});
it('should do something',() => {
const event = {
target: {
value: '12341111'
},
preventDefault: function() {
}
};
spyOn(event, 'preventDefault');
inputEl.triggerEventHandler('keypress', event);
fixture.detectChanges();
expect(event.preventDefault).toHaveBeenCalled();
});
});
當我運行單元測試,我得到一個未定義的值limit
。爲什麼這個值是不確定的?
要完全回答這個問題:爲什麼是價值不確定的,爲什麼它是在這種情況下,重要的是要打電話在觸發按鍵事件之前調用fixture.detectChanges():它初始化數據綁定。在調用'detectChanges()'之前,OP觸發事件。因此,數據綁定不到位,並且「限制」仍未定義。 – Poger