2017-04-12 75 views
5

你可能帮我嘲笑商店吗? 我见过thisthis问题由一个有点不同的错误。 我在我的服务中使用商店,我使用调度,选择并获取商店方法。 我嘲笑了商店以下@noelmace建议,并使用下面的调度,减速和国家创造店:模拟ngrx /存储在Angular2测试

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>(); 

所以我Mockstore类看起来如下:

export class MockStore<T> extends Store<T> { 

    //as given above 
    constructor() { 
     super(_dispatcher, _reducer, state$); 
    } 
    //as given above 
} 

然而,当我尝试定义我在测试服下列方式它说

TypeError: _store.select is not a function

此故障是由TestedService构造以下行引起的:

constructor(private _store: Store<TabStore>) { 
    let tabStore: Observable<TabStore> = _store.select<TabStore>('myReducer');| 
} 

这里是我的测试:

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] 
       } 
      ] 
     }); 
    }); 

谈到进口了也没有帮助。有没有人有想法嘲笑有什么问题?

回答

2

最后我找到了一个解决方案,以嘲笑的商店。不知道@maxisam答案是对还是错,但这里是我用过的解决方案。

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; 
    } 

} 

这以后可以使用如下:

{provide: Store, useClass: MockStore} 
+1

自从上次NGRX更新4.0.0,这不工作了 –

0

这是我得到的解决方案。这并不完美,但它适用于我的情况。

基本上派遣方法是茉莉花间谍和验证行动是我所期望的。

export class MockStore<T> extends BehaviorSubject<T> { 
    constructor(private _initialState: T) { 
     super(_initialState); 
    } 
    dispatch = (action: Action): void => { 
    } 

    select = <T, R>(pathOrMapFn: any, ...paths: string[]): Observable<R> => { 
     return map.call(this, pathOrMapFn); 
    } 
    nextMock(mock: T) { 
     this.next(mock); 
    } 
} 

我使用下面的代码提供商

{ provide: Store, useValue: new MockStore({test: 'test'}) }