【问题标题】:Angular2 FormBuilder unit testingAngular2 FormBuilder 单元测试
【发布时间】:2016-09-26 20:50:42
【问题描述】:

关于在 Angular2 中模拟 Formbuilder,我有两个问题。

1) 如何在规范中模拟 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
    });
  }
}

【问题讨论】:

    标签: angular unit-testing mocking angular2-forms


    【解决方案1】:

    如果您使用的是最新版本的 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: 'test@test.com',
          password: '12345'
        };
        comp.loginForm.controls['email'].setValue(testUser.email);
        comp.loginForm.controls['password'].setValue(testUser.password);
        expect(comp.user).toEqual(testUser);
      }));
    });
    

    【讨论】:

      【解决方案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();
        });
      ...
      

      【讨论】:

      • 你能告诉我你在哪里实现这个的完整规范吗?你是在beforeEach 中声明sut 吗?
      • 是的,我在“befoereach”中声明 sut。请参阅我的更新以获取我的代码 sn-p。
      猜你喜欢
      • 2018-01-16
      • 1970-01-01
      • 2023-02-17
      • 2016-10-19
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      相关资源
      最近更新 更多