我正在尝试为我的效果编写一些单元测试,但是测试似乎没有到达我拥有expect的部分。我不想使用jasmine-marbles,我只是想直接使用普通的jasmine。
效应
@Effect
loadData$: Observable<Action> = this.actions$.pipe(
ofType(actions.LOAD_DATA),
switchMap(actions =>
this.dataService.getData().pipe(
map(data => new actions.LoadDataSuccess(data)),
catchError(err => of(new actions.LoadDataFailed(err)))
)
)
);规范文件
let effects: fromData.DataEffects;
let actions: Observable<any>;
let mockState: fromData.DataState;
let mockDataService: jasmine.SpyObj<DataService>;
beforeEach((async(() => {
mockState = { name: 'Test', age: 40 };
mockDataService = jasmine.createSpyObj({'dataService', getData: of<Data>(mockState)});
TestBed.configureTestingModule({
imports: [],
providers: [
fromData.DataEffects,
provideMockActions(() => actions),
{ provide: DataService, useValue: mockDataService }
]
});
effects = TestBed.get(fromData.DataEffects);
})));
it('should return new success action after load', fakeAsync(() => {
let data: any;
const actions = new ReplaySubject(1);
actions.next(new fromData.LoadAction());
effects.loadData$.subscribe(result => {
data = result;
});
tick(100);
expect(data).toEqual(fromData.LoadDataSuccess);
}));测试失败是因为Expected undefined to equal Function。
注意,我使用的是角6和最新的ngrx和RxJS 6。
谢谢!
发布于 2018-08-07 20:19:50
这行得通吗?
effects.loadData$.subscribe(result => {
data = result;
expect(data).toEqual(fromData.LoadDataSuccess);
});发布于 2018-08-08 19:02:19
最终,必须使用来自rxjs的ReplaySubject。必须在ReplaySubject函数中实例化一个新的actions对象作为actions对象。
actions = new ReplaySubject(1);然后在我的单元测试中:
it('should return new success action after load', (done) => {
actions.next(new fromData.LoadAction());
const sub = effects.loadData$.subscribe(result => {
expect(result).toEqual(fromData.LoadDataSuccess(mockState));
done();
setTimeout(() => sub.unsubscribe());
});
});发布于 2019-01-30 06:20:14
您可以使用“rxjs”中的主题来模拟“@ngrx/effects”中的操作。
const actions = new Subject();然后在测试模块的提供者中
{ provide: Actions, useValue: actions }在单元测试中,当您需要触发某些效果时,订阅您的效果来测试您预期的操作/行为。然后简单调用actions.next(新的TriggerAction())。
https://stackoverflow.com/questions/51733749
复制相似问题