簡體   English   中英

在Angular2測試中模擬ngrx /存儲

[英]Mock ngrx/store in Angular2 tests

你可以幫我嘲笑商店嗎? 我已經看到了這個這個問題有一個不同的錯誤。 我在我的一個服務中使用商店,我使用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>();

所以我的Mockstore類看起來如下:

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

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

但是,當我嘗試按照測試方式定義我的服務時,它說

TypeError:_store.select不是函數

此失敗是由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]
                }
            ]
        });
    });

評論進口也無濟於事。 有沒有人有想法嘲笑有什么問題?

最后,我找到了一個模擬商店的解決方案。 不確定@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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM