2016-09-26 81 views
1

關於在Angular2中嘲笑Formbuilder,我有兩個問題。Angular2 FormBuilder單元測試

1)如何在規範中模擬formBuilder?有沒有給我們可以使用的嘲笑?我想舉個例子,在我的規範中更新表單的值,然後測試以確定表單是否仍然有效 - 或者測試組件中更新formbuilder組的方法的功能,或者確定是否有formbuilder組已驗證。

2)鑑於fb是Formbuilder在規範中的DI注入,我該如何處理以下錯誤?

null is not an object (evaluating 'this.fb.group')

當組件如下:

export class LoginComponent implements OnInit { 
    constructor(private fb: FormBuilder) {} 

    ngOnInit() { 
    this.loginForm = this.fb.group({ 
     'email': this.user.email, 
     'password': this.user.password 
    }); 
    } 
} 

回答

2

我真正建立FormBuilder的新實例,並正在測試它給組件。

sut = new LoginComponent(service, new FormBuilder()); 

如果你想修改屬於您ControlGroup任何控制/ FormGroup那麼你可以做到這一點在下列方式:

(<Control>sut.loginForm.controls['Name']).updateValue('Jon Doe'); 

您可以測試有效性,以及:

sut.loginForm.valid 

更新:

describe('Component',() => { 
    let sut: Component; 
    let service: Service; 

    beforeEach(() => { 
    service = new Service(null); 
    sut = new Component(new FormBuilder(), service); 
     }); 

    it('should have object initialized',() => { 
    expect(sut.selectedBankAccount).toBeDefined(); 
    }); 
... 
+0

你能告訴我一個完整的規範,你在執行這個嗎?你是否在'''beforeEach'''聲明'''sut'''? –

+0

是的,我在「befoereach」中宣佈了自己的意思。查看我的更新瞭解我的代碼片段。 – Pradeep

3

如果您使用的是最新版本的Angular2,並且想要使用他們的測試平臺,那麼這是一個工作規範。

describe('Login Component',() => { 
    let comp: LoginComponent; 
    let fixture: ComponentFixture<LoginComponent>; 

    beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
     declarations: [LoginComponent], 
     providers: [ 
     FormBuilder 
     ] 
     }).compileComponents() 
     .then(() => { 
     fixture = TestBed.createComponent(LoginComponent); 
     comp = fixture.componentInstance; 
     }); 
    })); 

    it('user should update from form changes', fakeAsync(() => { 
    const testUser = { 
     email: '[email protected]', 
     password: '12345' 
    }; 
    comp.loginForm.controls['email'].setValue(testUser.email); 
    comp.loginForm.controls['password'].setValue(testUser.password); 
    expect(comp.user).toEqual(testUser); 
    })); 
});