nit*_*loz 5 unit-testing mocking jasmine ngrx angular
你可以帮我嘲笑商店吗?我已经看到了这个和这个问题有一个不同的错误.我在我的一个服务中使用商店,我使用dispatch,select和get store方法.我在@noelmace建议之后嘲笑了商店,并使用了以下调度程序,reducer和state创建商店:
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>();
Run Code Online (Sandbox Code Playgroud)
所以我的Mockstore类看起来如下:
export class MockStore<T> extends Store<T> {
//as given above
constructor() {
super(_dispatcher, _reducer, state$);
}
//as given above
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试按照测试方式定义我的服务时,它说
TypeError:_store.select不是函数
此失败是由TestedService构造函数中的以下行引起的:
constructor(private _store: Store<TabStore>) {
let tabStore: Observable<TabStore> = _store.select<TabStore>('myReducer');|
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试:
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]
}
]
});
});
Run Code Online (Sandbox Code Playgroud)
评论进口也无济于事.有没有人有想法嘲笑有什么问题?
最后我找到了一个模拟商店的解决方案。不确定 @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;
}
}
Run Code Online (Sandbox Code Playgroud)
稍后可以按如下方式使用:
{provide: Store, useClass: MockStore}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3841 次 |
| 最近记录: |