2017-05-26 63 views
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。爲什麼這個值是不確定的?

回答

3

將fixture.detectChanges()移動到頂部。

it('should do something',() => { 
    fixture.detectChanges(); 

    const event = { 
     target: { 
     value: '12341111' 
     }, 
     preventDefault: function() { 
     } 
    }; 

    spyOn(event, 'preventDefault'); 
    inputEl.triggerEventHandler('keypress', event); 

    expect(event.preventDefault).toHaveBeenCalled(); 
    }); 

此外我認爲你需要改變你的指令來限制字符串轉換爲數字:

if (event.target.value.length === +this.limit) { 
+0

要完全回答這個問題:爲什麼是價值不確定的,爲什麼它是在這種情況下,重要的是要打電話在觸發按鍵事件之前調用fixture.detectChanges():它初始化數據綁定。在調用'detectChanges()'之前,OP觸發事件。因此,數據綁定不到位,並且「限制」仍未定義。 – Poger