Я пытаюсь написать модульные тесты для службы в 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)
);
}