Макетные селекторы магазина ngrx с параметрами в модульных тестах (Angular) - PullRequest
1 голос
/ 18 апреля 2019

Я пытаюсь написать модульные тесты для службы в Angular.Я хочу смоделировать функцию store.select в ngrx, чтобы я мог проверить, как, скажем, служба реагирует на различные значения, возвращаемые селекторами магазина.Я хочу, чтобы можно было смоделировать каждый селектор по отдельности.

Моя главная проблема заключается в том, как смоделировать параметризованные селекторы.

Ранее я использовал объект BehaviourSubject, который я сопоставляю с функцией выбора, но это нене позволяют вам возвращать разные значения для разных селекторов.Он не читается, потому что неясно, над каким селектором вы издеваетесь.

Опция 1: Ложное хранилище с использованием субъекта: невозможно определить, какому селектору соответствует объект, нельзя вернуть разные значения для разных селекторов.

// service.spec.ts

const selectSubject = new BehaviourSubject(null);
class MockStore {
    select = () => selectSubject;
}

Опция 2: Mock Store с использованием switch: работает для разных селекторов, но не может заставить его работать, когда селекторы имеют параметры.

// service.spec.ts

    // This works well but how can I make it work with selectors with parameters??
    const firstSubject = new BehaviourSubject(null);
    const secondSubject = new BehaviourSubject(null);
    class MockStore {
        select = (selector) => {
            switch (selector): {
                case FirstSelector: {
                    return firstSubject;
                }
                case SecondSelector: {
                    return secondSubject;
                }
             }
        };
    }

    describe('TestService', () => {
        let service: TestService;
        let store: Store<any>;

        beforeEach(() => {
            TestBed.configureTestingModule({
              providers: [
                TestService,
                { provide: Store, useClass: MockStore }
              ],
            });

            service = TestBed.get(TestService);
            store = TestBed.get(Store);
          });

          it('should do X when first selector returns A and second selector returns B', () => {
            firstSelectorSubject.next(A);
            secondSelectorSubject.next(B);

        // Write expectation
          });
    });

Сервисный метод с параметризованным селектором, который я хочу смоделировать, чтобы я мог протестировать getUserName с различными значениями идентификатора

getUserName(id: string): Observable<string> {
    return this.store.select(getUser(id)).pipe(
      filter(user => user !== null),
      map(user => user.fullName)
    );
  }
...