Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 如何在ngrx效果中使用LatestFrom进行单元测试_Angular_Ngrx_Jasmine Marbles - Fatal编程技术网

Angular 如何在ngrx效果中使用LatestFrom进行单元测试

Angular 如何在ngrx效果中使用LatestFrom进行单元测试,angular,ngrx,jasmine-marbles,Angular,Ngrx,Jasmine Marbles,我有一个效果,就是从params获取最新的数据,并将其传递到一个defaustmap,然后调用一个服务 @Effect() loadPlansOnParams$ = this.actions$.pipe( ofType(backlogActions.BacklogActionTypes.GET_BOARDS_IN_PARAMS), withLatestFrom(this.store.select(fromRoot.getRouterState), (action, router) =>

我有一个效果,就是从params获取最新的数据,并将其传递到一个defaustmap,然后调用一个服务

@Effect()
loadPlansOnParams$ = this.actions$.pipe(
 ofType(backlogActions.BacklogActionTypes.GET_BOARDS_IN_PARAMS),
 withLatestFrom(this.store.select(fromRoot.getRouterState), (action, router) => {
   const {
     state: {
       queryParams: { boards },
     },
   } = router;
   return {
     boards,
   };
 }),
 exhaustMap(payload => {
   return this.boardService.getBoardsFromParams(payload.boards).pipe(
     map((res: SignalRResult) => {
       const board = res.item;
       return new backlogActions.GetBoardsSuccess(board);
     }),
     catchError(err => of(new backlogActions.GetBoardsError(err))),
   );
 }),
);
一切都很酷。然而,我无法用我的生命来检验这一点。我能找到的每一个例子都是无用的

这是我的测试

describe('getting boards from the params', () => {
    it('should return an empty array if no params', () => {
      const params = { state: { queryParams: {} } };
      const successfulSignalRResult = { isSuccessful: true, item: [] };
      const action = new backlogActions.GetBoardsInParams();
      const outcome = new backlogActions.GetAvailableBoardsSuccess([]);
      actions.stream = hot('-a', { a: action });
      store.select = jest.fn(() => of(params));
      expected = cold('--b', { b: outcome });
      boardSvc.getBoardsFromParams = jest.fn(() => successfulSignalRResult);
      expect(effects.loadPlansOnParams$).toBeObservable({});
    });
  });

无论我如何处理store.select mock,我都会返回“您在预期流的位置提供了‘未定义’。”


感谢您的帮助。我真的希望我在大理石上遗漏了什么。

也许,这是迟来的答案。我也遇到了同样的问题

我不知道确切的原因。在我看来,当MockStore和effect同时使用时,getRouterState并没有初始化。在构造函数中初始化loadPlansOnParams$时,getRouterState未正确初始化

简单地说,getRouterState的初始化位于loadPlansOnParams$之前,如下所示

@Effect()

SomeVariableForGetRouterState:Observable<SomeThing> = ..... fromRoot.getRouterState ..... like this.. 

loadPlansOnParams$ = this.actions$.pipe(
ofType(backlogActions.BacklogActionTypes.GET_BOARDS_IN_PARAMS),
withLatestFrom( SomeVariableForGetRouterState, (action, router) => {
.....
);
@Effect()
SomeVariableForGetRoterState:Observable=。。。。。fromRoot.getRouterState。。。。。这样地。。
loadPlansOnParams$=此.actions$.pipe(
类型(backlogActions.BacklogActionTypes.GET_BOARDS_IN_PARAMS),
withLatestFrom(someVariableForGetRotterState,(操作,路由器)=>{
.....
);

这有点晚了,但我遇到了类似的问题。我相信您必须使用正确的路由器数据初始化存储。 非常感谢你和他的朋友

注意事项:

  • 我正在使用provideMockStore和provideMockActions
  • 我正在初始化测试床并提供模拟实现
以下是我的工作示例:

从“茉莉花大理石”导入{冷,热}
从“@ngrx/effects/testing”导入{provideMockActions};
从'@ngrx/store/testing'导入{MockStore,provideMockStore};
从“@angular/core/testing”导入{TestBed};
从“”以fromStore的形式导入*;
从“共享库”导入{ApplicationDocument};
从'@ngrx/effects'导入{Actions};
从“../application document.service”导入{ApplicationDocumentService};
从“/application document.effects”导入{ApplicationDocumentEffects};
描述('ApplicationDocument Store',()=>{
let applicationDocument:applicationDocument
让错误:任何
让动作$:动作
let服务:ApplicationDocumentService
let效果:ApplicationDocumentEffects
让商店:有吗
描述('效果',()=>{
//注意:必须使用路由器状态初始化存储
常量初始状态={
路由器:{
状态:{params:{applicationId:1}}
}
}
beforeach(异步()=>{
TestBed.configureTestingModule({
供应商:[
应用文档效果,
provideMockStore({initialState}),//actions$),
{
提供:ApplicationDocumentService,
使用价值:{
getDocuments:jest.fn()
}
}
]
})
effects=TestBed.inject(ApplicationDocumentEffects)
service=TestBed.inject(ApplicationDocumentService)
store=TestBed.inject(MockStore)
})
它('应该创建',()=>{
expect(effects.toBeTruthy();
});
描述('loadDocuments',()=>{
它('应返回LoadApplicationDocumentsAccess操作,以及文档',()=>{
applicationDocument={documentId:1};
const action=fromStore.loadApplicationDocuments();
const output=fromStore.LoadApplicationDocumentsAccess({
应用文档:[应用文档]
})
actions$=hot('-a',{a:action})
const response=cold('-a |',{a:[applicationDocument]})
const expected=cold('--b',{b:output})
service.getDocuments=jest.fn(()=>响应)
expect(effects.loadApplicationDocuments$).toBeObservable(预期)
})
})
})

})
你找到这个问题的答案了吗?我遇到了完全相同的问题。没有经过测试。