ngneat / forms-manager

🦄 The Foundation for Proper Form Management in Angular

Home Page:https://www.netbasal.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

valueChanges in unit tests

pfosser opened this issue · comments

I'm submitting a...


[ ] Regression (a behavior that used to work and stopped working in a new release)
[ ] Bug report  
[ ] Performance issue
[ ] Feature request
[ ] Documentation issue or request
[X ] Support request
[ ] Other... Please describe:

Current behavior

Unable to make a valueChanges reaction to work in a unit test

Expected behavior

A subscription to valueChanges should work in unit tests too (but maybe I'm missing something).

Minimal reproduction of the problem with instructions

The only other non-default dependency is Specator. Simply run npm test to see it failing.

// ### app.component.ts
interface AppForms {
  myForm: {
    theInput: string;
  };
}
@Component({
  selector: 'app-root',
  template: `<form [formGroup]="form"><input type="text" formControlName="theInput" /></form> `,
  styles: [],
})
export class AppComponent implements OnInit, OnDestroy {
  private formKey: 'myForm';

  form: FormGroup;

  constructor(
    private formsManager: NgFormsManager<AppForms>,
    private fb: FormBuilder
  ) {}
  ngOnInit(): void {
    this.form = this.fb.group({
      theInput: [null],
    });
    this.formsManager.upsert(this.formKey, this.form);

    // This makes the test go green
    // this.form
    //   .get('theInput')
    //   .valueChanges.pipe(filter((value) => value != null))
    //   .subscribe(this.valueSetter);

    this.formsManager
      .valueChanges(this.formKey, 'theInput')
      .pipe(filter((value) => value != null))
      .subscribe(this.valueSetter);
  }

  private valueSetter = (value) =>
    this.form.get('theInput').setValue(value + 'Append', { emitEvent: false });

  ngOnDestroy(): void {
    this.formsManager.destroy(this.formKey);
  }
}
// ### app.component.spec.ts
describe('AppComponent', () => {
  let spectator: Spectator<AppComponent>;
  const createComponent = createComponentFactory({
    component: AppComponent,
    imports: [ReactiveFormsModule]
  });

  beforeEach(() => (spectator = createComponent()));

  it(`should update the value of the input field`, () => {
    const value = 'someText';
    spectator.typeInElement(value, 'input');

    const actual = spectator.component.form.controls.theInput.value;

    expect(actual).toEqual(value + 'Append');
  });
});

What is the motivation / use case for changing the behavior?

Environment


Angular version: 9.1.11
and it fails with version 10.0.2 too

Browser:
- [x ] Chrome (desktop) version 83.0.4103.116
- [ ] Chrome (Android) version XX
- [ ] Chrome (iOS) version XX
- [ ] Firefox version XX
- [ ] Safari (desktop) version XX
- [ ] Safari (iOS) version XX
- [ ] IE version XX
- [ ] Edge version XX
 
For Tooling issues:
- Node version: 10.16.0
- Platform:  Linux

Others:

We use debounce. Try to use spectator.tick(301)

Great, that's what I missed! Thank you very much.