web-dev-qa-db-ja.com

この効果をユニットテストする方法({dispatch:false}を使用)?

ngrxとユニットテストの初心者はこちら。私は次の効果があります:

@Injectable()
export class NotificationEffects {
  @Effect({dispatch: false})
  notificationShow$ = this.actions$
    .ofType(notificationAction.NOTIFICATION_SHOW)
    .do((action: notificationAction.NotificationShowAction) => {
      this.notificationService.info(action.payload.config);
    });

  constructor(private actions$: Actions, private notificationService: NotificationService) {}
}

具体的には、notificationServiceメソッド情報が呼び出されたことをテストしたいと思います。どうすればいいですか?

私はこれらの例に従いましたが、解決策が見つかりませんでした:

https://netbasal.com/unit-test-your-ngrx-effects-in-angular-1bf2142dd459https://medium.com/@adrianfaciu/testing-ngrx-effects -3682cb5d760ehttps://github.com/ngrx/effects/blob/master/docs/testing.md

12
camden_kid

だからそれはこれと同じくらい簡単です:

describe('notificationShow$', () => {
  let effects: NotificationEffects;
  let service: any;
  let actions$: Observable<Action>;
  const payload = {test: 123};

  beforeEach( () => {
    TestBed.configureTestingModule( {
      providers: [
        NotificationEffects,
        provideMockActions( () => actions$ ),
        {
          provide: NotificationService,
          useValue: jasmine.createSpyObj('NotificationService', ['info'])
        }
      ]
    } );

    effects = TestBed.get(NotificationEffects);
    service = TestBed.get(NotificationService);
  });

  it('should call a notification service method info with a payload', () => {
    actions$ = cold('a', { a: new notificationAction.NotificationShowAction(payload) });
    effects.notificationShow$.subscribe(() => {
      expect(service.info).toHaveBeenCalledWith(payload);
    });
  });
});
11
camden_kid
it('should call a notification service method info with a payload', () => {
    actions$ = cold('a', { a: new notificationAction.NotificationShowAction(payload) });
    effects.notificationShow$.subscribe(() => {
      expect(service.info).toHaveBeenCalledWith(payload);
    });
  });

それはうまく機能しますが、問題はエラーが発生したときです。この場合、エラーはテストランナーに報告されません(私の場合は冗談です)。エラーを取得するには、trycatchブロックを追加する必要があります。

   it('should call a notification service method info with a payload', () => {
        actions$ = cold('a', { a: new notificationAction.NotificationShowAction(payload) });
        effects.notificationShow$.subscribe(() => {
            try {
                expect(service.info).toHaveBeenCalledWith(payload); 
            } catch (error) {
                fail('notificationShow$: ' + error);
            }
        });
    });
0
David Sajdl