¿Podrías ayudarme a burlarme de la Tienda? He visto esto y estas preguntas por un error un poco diferente. Estoy usando la tienda en uno de mis servicios, donde uso los métodos de envío, selección y obtención de la tienda. Me burlé de la tienda siguiendo la sugerencia de @noelmace y usé el siguiente despachador, reductor y estado creando la tienda:
export class ObservableMock implements Observer<any> { closed?: boolean = false; // inherited from Observer nextVal: any = ''; // variable I made up constructor() { } next = (value: any): void => { this.nextVal = value; }; error = (err: any): void => { console.error(err); }; complete = (): void => { this.closed = true; } } let _reducer: ObservableMock = new ObservableMock(); let _dispatcher: ObservableMock = new ObservableMock(); let state$: Observable<any> = new Observable<any>();Así que mi clase de Mockstore se ve como sigue:
export class MockStore<T> extends Store<T> { //as given above constructor() { super(_dispatcher, _reducer, state$); } //as given above }Sin embargo, cuando trato de definir mi servicio en la siguiente forma de prueba, dice
TypeError: _store.select no es una función
Esta falla es causada por la siguiente línea en el constructor TestedService:
constructor(private _store: Store<TabStore>) { let tabStore: Observable<TabStore> = _store.select<TabStore>('myReducer');| }Aquí está mi prueba:
beforeEach(() => { TestBed.configureTestingModule({ imports: [ // StoreModule.provideStore({myReducer: myReducer}), ], providers: [ {provide: Store, useClass: MockStore}, { provide: TestedService, useFactory: (tabStore: Store<TabStore>): TestedService=> { return new TestedService(myStore); }, deps: [Store] } ] }); });Comentar las importaciones tampoco ayuda. ¿Alguien tiene idea de lo que tiene de malo burlarse?
Finalmente encontré una solución para burlarme de la tienda. No estoy seguro si la respuesta de @maxisam es correcta o incorrecta, pero aquí hay una solución que he usado.
let _reducer: ObservableMock = new ObservableMock(); let _dispatcher: ObservableMock = new ObservableMock(); let state$: Observable<any> = new Observable<any>(); export class MockStore<T> extends Store<T> { private _fakeData: Object = {}; private fakeDataSubject: BehaviorSubject<Object> = new BehaviorSubject(this._fakeData); select = <T, R>(mapFn: any, ...paths: string[]): Observable<any> => { if (typeof mapFn !== 'function') { mapFn = () => mapFn; } return this.fakeDataSubject.map(mapFn); }; constructor() { super(_dispatcher, _reducer, state$); } nextMock(mock: Object, ...keys: string[]) { let curMockLevel = this._fakeData = {}; keys.forEach((key, idx) => { curMockLevel = curMockLevel[key] = idx === keys.length - 1 ? mock : {}; }); this.fakeDataSubject.next(this._fakeData); } get fakeData() { return this._fakeData; } }Esto se puede utilizar más tarde de la siguiente manera:
{provide: Store, useClass: MockStore}