加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

单元测试 – 在Angular2测试中模拟ngrx /存储

发布时间:2020-12-17 07:15:53 所属栏目:安全 来源:网络整理
导读:你可以帮我嘲笑商店吗? 我已经看到 this和 this问题有一个不同的错误. 我在我的一个服务中使用商店,我使用dispatch,select和get store方法. 我在@noelmace建议之后嘲笑了商店,并使用了以下调度程序,reducer和state创建商店: export class ObservableMock i
你可以帮我嘲笑商店吗?
我已经看到 this和 this问题有一个不同的错误.
我在我的一个服务中使用商店,我使用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 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]
                }
            ]
        });
    });

评论进口也无济于事.有没有人有想法嘲笑有什么问题?

解决方法

最后,我找到了一个模拟商店的解决方案.不确定@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,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}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读