Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

not understanding how to test subscription side effects #566

Open
2 of 9 tasks
arkD opened this issue Jan 23, 2020 · 1 comment
Open
2 of 9 tasks

not understanding how to test subscription side effects #566

arkD opened this issue Jan 23, 2020 · 1 comment

Comments

@arkD
Copy link

arkD commented Jan 23, 2020

This is a...

  • feature request
  • bug report
  • usage question

What toolchain are you using for transpilation/bundling?

  • @angular/cli
  • Custom @ngTools/webpack
  • Raw ngc
  • SystemJS
  • Rollup
  • Other

Environment

NodeJS Version: 10.16.0
Typescript Version: 3.2.4
Angular Version: 7
@angular-redux/store version: 9
@angular/cli version: (if applicable) 7.3
OS: windows

Link to repo showing the issus

(optional, but helps a lot)
private sorry

The Problem:

I don't understand and hours of investigation and research so far have not helped
I have an encoded cache store with default values.
I want to test my component theme is updated correctly from the store and get more complex from there.

here is a snippet:

  @select() theme$: Observable<IAppTheme>;
  theme: IAppTheme;

  constructor(public overlay: OverlayContainer,
              public acts: Actions) {
    this.theme$.subscribe((theme: IAppTheme) => {
      this.setTheme(theme.product.name); // this function changes a bunch of css based on the theme and uses the theme name to call the right css classes
      this.theme = theme; // this makes it easier and a lot less ugly in the html then using | async everywhere
    });
  }

  ngOnInit(): void {
    this.acts.installTheme(this.theme); // this is an Action that updates the theme,  it is there because its annoying to switch themes to see changes every time I made changes to them.
  }

I would like to use my store's defaults, not create a mock if possible to test this

The Test:

  beforeEach(() => {
    fixture = TestBed.createComponent(AppComponent);
    router = TestBed.get(Router);
    component = fixture.componentInstance;
    redux = TestBed.get(NgRedux);
    de = fixture.debugElement;

    fixture.detectChanges();
  });

  it('should update theme through subscription in init', fakeAsync(() => {
    expect(component.theme).toBeUndefined(); // passes
    component.ngOnInit();
    fixture.detectChanges();
    flushMicrotasks();
    fixture.whenStable().then(() =>
      expect(component.theme).toBeUndefined(); // passes but not what I want
      // expect(component.theme.name).toBe('default'); // what I want to pass
    );
  }));

not sure if it is obvious but I have no idea how to get the observable to complete so I get something other than undefined.

The Question

It is clear to me that I don't understand the testing environment, as it appears the store behaves differently? how can I test this?

@arkD
Copy link
Author

arkD commented Jan 24, 2020

ok after looking at your documentation again, I realized I was over complicating this
so I did this instead:

  it('should update theme through subscription in init', (done: DoneFn) => {
    const themeStub: Subject<IAppTheme> = MockNgRedux.getSelectorStub<IAppTheme, IAppTheme>('theme');
    themeStub.next(THEME_INIT_STATE);
    themeStub.complete();
    component.theme$.subscribe((actual: IAppTheme) => {
      expect(component.theme).toBe('default');
      done();
    });
  });

but I still don't understand why I can't just get this from my native store using like my app does every time it runs? do I need to run configureStore or include my StoreModule? I tried including my store module before but it had problems with my encryption/decryption transforms

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant