2016-09-26 120 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); 
    })); 
});