Я использую Angular 7, ngrx 7 и rxjs 6.3.3.
Как сделать макет takeWhile, используя MockStore, который я покажу ниже?Я называю ngOnDestroy в тесте, и поток не «отписался».
Используя ngrx и т. Д., У меня есть такая функция:
this.store
.pipe(
select(employeeSelectors.showMailingAddress),
takeWhile(() => this.componentActive)
)
.subscribe(showMailingAddress => {
this.showMailingAddress = showMailingAddress;
});
Я использую MockStore следующим образом:
import { Subject, Observable, BehaviorSubject, of } from 'rxjs';
interface SelectorMap {
[key: string]: Function;
}
interface SubjectMap {
[key: string]: Subject<any>;
}
const mockedValueShowMailingAddress = true;
const storeSubjectMock = new
BehaviorSubject(mockedValueShowMailingAddress);
export class MockStore {
public selectStreams: SubjectMap = {};
constructor(private selectors: SelectorMap) {}
public pipe() {
return storeSubjectMock.asObservable();
}
public reset() {
Object.values(this.selectStreams).map(subject =>
subject.complete());
this.selectStreams = {};
this.selectors = {};
}
public dispatch(obj) {}
public select(selector): Observable<any> {
const selectKey = getKeyByValue(this.selectors, selector);
if (!this.selectStreams[selectKey]) {
this.selectStreams[selectKey] = new Subject();
}
return this.selectStreams[selectKey];
}
}
function getKeyByValue(object, value) {
return Object.keys(object).find(key => object[key] === value);
}
И мой ngOnDestroy такой:
ngOnDestroy() {
this.componentActive = false;
}