【问题标题】:Not able to set input value, when I use 'updateOn' attribute with form Control当我将“updateOn”属性与表单控件一起使用时,无法设置输入值
【发布时间】:2020-03-07 19:32:40
【问题描述】:

我正在使用 https://testing-library.com/ 进行测试

这是我的响应式表单:

this.createForm = this.formBuilder.group({
 'Id': new FormControl({ value: 0, disabled: true }, [Validators.required]),
 'Name': new FormControl('', { validators: [ValidationService.required, ValidationService.SubsystemMxLenght, ValidationService.SubsystemPatternMatch], updateOn: 'blur' }),
'UpdatedByName': new FormControl({ value: this.appUserName, disabled: true }, []),
 'UpdatedDate': new FormControl({ value: '', disabled: true }, [])

});

根据图书馆的建议,我将值设置为这样的表单字段:

component.input(component.getByTestId('form-create-name-field-1'), {
        target: {
            value: data.Name /* value not setting since we use updateOn value, so it's null */
        }
    });

    component.input(component.getByTestId('form-create-name-field-2'), {
        target: {
            value: data.UpdatedByName
        }
    });

其中我无法使用Name 设置值,如果我从表单中删除参数updateOn: 'blur' - 它会设置。如何解决这个问题?否则我的表单有什么问题?

有人帮帮我吗?

更新: 组件功能:

onCreateFormSubmit() {

 this.ssCreated.emit(created);

}

同时测试 onCreateFormSubmitssCreated - 但 ssCreated 不起作用:

规格文件:

test('Testing add Subsystem operation', async () => {

    const data = {
        Id: 2,
        Name: 'subsystem2',
        IsDeletePossible: true,
        CreatedBy: '',
        CreatedDate: new Date(),
        UpdatedBy: '',
        UpdatedDate: new Date(),
        UpdatedByName: 'test value',
        CreatedByName: ''
    } as ModelSubSystem;

    const ssCreated = jest.fn();

    const component = await render(SubSystemComponent, {
        schemas: [CUSTOM_ELEMENTS_SCHEMA],
        imports: [
            HttpClientTestingModule,
            FormsModule,
            ReactiveFormsModule,
            StoreModule.forRoot({}, { runtimeChecks: { strictStateImmutability: true, strictActionImmutability: true } }),
            StoreModule.forFeature('pfservice', reducer),
            EffectsModule.forRoot([]),
            EffectsModule.forFeature([EffectsSubSystem])
        ],
        componentProperties: {
            onCreateFormSubmit: jest.fn(),
            ssCreated: {
                emit: data
            } as any,
        }

    });

    const componentInstance = component.fixture.componentInstance;


    /*
     *   Testing the form by DOM.
     */

    const createButton = component.getByTestId('btn-addRow');
    component.click(createButton);
    component.fixture.detectChanges();
    // status changes because of click on button
    expect(componentInstance.crud.isCreate).toBeTruthy();

    component.fixture.detectChanges();
    // onclick submit should not called, becasue of empty input

    component.input(component.getByTestId('form-create-name-field-0'), {
        target: {
            value: data.Id
        }
    });

    component.input(component.getByTestId('form-create-name-field-1'), {
        target: {
            value: data.Name
        }
    });


    component.blur(component.getByTestId('form-create-name-field-1'));

    component.input(component.getByTestId('form-create-name-field-2'), {
        target: {
            value: data.UpdatedByName
        }
    });

    const submit = component.getAllByTestId('form-create-btn')[0];

    component.click(submit);

    component.fixture.detectChanges();
    const name = componentInstance.createForm.controls['Name'];
    const updatedByName = componentInstance.createForm.controls['UpdatedByName'];
    expect(name.value).toEqual(data.Name);
    expect(name.errors).toBeFalsy();
    expect(updatedByName.value).toEqual(data.UpdatedByName);
    expect(componentInstance.onCreateFormSubmit).toBeCalled(); //works

    // console.log(componentInstance.createForm.getRawValue());
    console.log(data);

    expect(ssCreated).toHaveBeenCalledWith(data); //not works

});

【问题讨论】:

  • data 变量来自哪里?在这一行target:{value:data.Name}
  • @GaurangDhorda - 我有静态数据是规范文件。 data.UpdatedByName - 工作

标签: angular angular-test angular-testing-library


【解决方案1】:

updateOne 只会在输入模糊时触发,这就是你必须这样做的原因:

component.input(component.getByTestId('form-create-name-field-1'), {
        target: {
            value: data.Name
        }
    });

// this line here
component.blur(component.getByTestId('form-create-name-field-1'));

我在这里创建了一个示例https://github.com/testing-library/angular-testing-library/commit/6989a66cfe2d0dfb66dcbb9566bf122307edca6c

【讨论】:

  • 我需要调用一个组件方法,该方法触发一个带有值的发射。如何测试两者?你能分享任何样品吗?在提交它的发生
  • 我不确定你的意思,你能详细说明一下吗?此外,您不必直接调用组件方法,而是应该通过 DOM 事件来执行它。
  • 你能检查我的更新吗?我正在尝试通过均衡传递数据来捕获emit 方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2016-11-04
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多