gpt4 book ai didi

angular - 发送 :false 时测试@Effect

转载 作者:行者123 更新时间:2023-12-04 03:09:53 26 4
gpt4 key购买 nike

我正在尝试测试 @Effect({ dispatch: false }) 正在调用 trackEvent() 方法,但效果不会引发任何进一步的操作所以不可能订阅可观察到的效果 described in the docs .

我的效果是这样的:

@Effect({ dispatch: false })
public trackPageView$: Observable<any> = this.action$
.ofType(ActionTypes.TRACK_PAGE_VIEW)
.map((action: TrackPageViewAction) => {
this.angulartics2Service.trackPageView(action.payload.path);
});

...我的规范摘录如下所示:

it(`should call #trackPageView('${testPath}')`, () => {
runner.queue(trackPageView(testPath));
let s = TestBed.get(Angulartics2Service);
expect(s.trackPageView.called).toBeTruthy(); // <-- fails!
});

我的 angulartics2Service 看起来像这样:

let angulartics2Service: Stubbed<Angulartics2Service>;

angulartics2Service = {
trackPageView: sinon.stub()
}

...在哪里

export type Stubbed<T> = {
[key in keyof T]?: T[key] & SinonStub;
};

如何在调用trackPageView() 方法时测试这个效果?

感谢任何帮助。

最佳答案

来晚了一点,但我遇到了同样的问题并最终来到这里。假设我正在测试以下效果:

  @Effect()
onPlaceOrder$ : Observable<any> = this.actions$.pipe(
ofType(CheckoutActionTypes.PlaceOrderAction),
map(() => new PlaceOrderSuccess())
);

@Effect({ dispatch: false })
onPlaceOrderSuccess$ : Observable<any> = this.actions$.pipe(
ofType(CheckoutActionTypes.PlaceOrderSuccessAction),
tap(() => {
this.router.navigateByUrl('/checkout/thank-you');
})
);

这就是我最终测试它们的方式:

  describe('when PlaceOrderAction is triggered', () => {

let expected;
const placeOrderAction = new PlaceOrder();

beforeEach(() => {
const placeOrderSuccessAction = new PlaceOrderSuccess();
actions$ = hot('--a', { a: placeOrderAction });
expected = cold('--b', { b: placeOrderSuccessAction });
});

it('should dispatch a PlaceOrderSuccess action', () => {
expect(effects.onPlaceOrder$).toBeObservable(expected);
});
});

describe('when PlaceOrderSuccessAction is triggered', () => {

let expected;
const placeOrderSuccessAction = new PlaceOrderSuccess();

beforeEach(() => {
actions$ = hot('--a', { a: placeOrderSuccessAction });
expected = cold('--b', { b: placeOrderSuccessAction });
});

it('should call router.navigateByUrl', () => {
//the actual effect doesn't trigger unless the following expect is run
expect(effects.onPlaceOrderSuccess$).toBeObservable(expected);

expect(router.navigateByUrl).toHaveBeenCalledWith('/checkout/thank-you');
});
});

顺便说一句,我正在使用 Jasmine 弹珠进行测试:https://github.com/synapse-wireless-labs/jasmine-marbles

为了获得运行效果。后来发现 dispatch: false 效果的返回值实际上是原始操作。这就是您如何测试您的 trackPageView() 方法被调用的方法。

关于angular - 发送 :false 时测试@Effect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46080070/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com