Search code examples
jasminengrx

How do I set a new State to test an observable?


I have tried all the day to make a simple test in jasmine, but i think i am doing something wrong. I have a piece of code that i wish to test, but i can't go inside. I was trying to follow nrgx 7 documentation, but i failed.

The unit test below should test my enderecoFeatureSubscription. The store.setState({ cep: null, endereco: RES }) is doing nothing with the store, so my subscription doens't do anything

  let component: FormComponent;
  let fixture: ComponentFixture<FormComponent>;
  let store: MockStore<ICepState>
  const initialState = {
    cep: null, endereco: null
  };
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [FormComponent],
      imports: [StoreModule.forRoot({}),],
      providers: [
        provideMockStore({ initialState: CEPSTATE })
      ]
    }).compileComponents();
  }));
  beforeEach(() => {
    fixture = TestBed.createComponent(FormComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
    store = TestBed.get(Store);
  });
  it('should test enderecoFeatureSubscription ', () => {
    store.setState({ cep: null, endereco: RES })
    expect(component.endereco).toEqual(RES)
  });

Component

private enderecoFeatureSubscription = this.store.pipe(select(enderecoFeatureSelector)).subscribe((endereco: IEndereco | any) => {
    if (!endereco) {
      return;
    }
    this.endereco = endereco
  })

If you can help i thank you, because i hav wasted a lot of time with it.


Solution

  • i did some changes to my test work fine. 1 - Removed 'const initialState' and imported from my app state file. 2 - The type of MockStore, i changed to my app state type 3 - In the test, i set a new value to 'cepState.endereco' and call setState with initialState 4 - I changed 'store' for 'mockStore', but it doesn't make diference 5 - finally, i brought the right import

    Look the code bellow:

    describe('FormComponent', () => {
      let component: FormComponent;
      let fixture: ComponentFixture<FormComponent>;
      let mockStore: MockStore<AppState>;
    
      beforeEach(async(() => {
        TestBed.configureTestingModule({
          declarations: [FormComponent],
          imports: [
            StoreModule.forRoot({ 'cepState': CepReducer })
          ],
          providers: [provideMockStore({ initialState })]
        }).compileComponents();
      }));
    
      beforeEach(() => {
        fixture = TestBed.createComponent(FormComponent);
        component = fixture.componentInstance;
        fixture.detectChanges();
        mockStore = TestBed.get(Store);
      });
    
      it('should test new endereco state', () => {
        initialState.cepState.endereco = RES
        mockStore.setState(initialState)
        expect(component.endereco).toEqual(RES)
      });
    
    });