首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你是如何测试ngrx效果的角6和没有茉莉花弹珠?

你是如何测试ngrx效果的角6和没有茉莉花弹珠?
EN

Stack Overflow用户
提问于 2018-08-07 19:03:35
回答 3查看 4.3K关注 0票数 3

我正在尝试为我的效果编写一些单元测试,但是测试似乎没有到达我拥有expect的部分。我不想使用jasmine-marbles,我只是想直接使用普通的jasmine

效应

代码语言:javascript
复制
@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)))
        )
    )
);

规范文件

代码语言:javascript
复制
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和最新的ngrxRxJS 6

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2018-08-07 20:19:50

这行得通吗?

代码语言:javascript
复制
effects.loadData$.subscribe(result => {
    data = result;
    expect(data).toEqual(fromData.LoadDataSuccess);
});
票数 1
EN

Stack Overflow用户

发布于 2018-08-08 19:02:19

最终,必须使用来自rxjs的ReplaySubject。必须在ReplaySubject函数中实例化一个新的actions对象作为actions对象。

代码语言:javascript
复制
actions = new ReplaySubject(1);

然后在我的单元测试中:

代码语言:javascript
复制
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());
    });
});
票数 1
EN

Stack Overflow用户

发布于 2019-01-30 06:20:14

您可以使用“rxjs”中的主题来模拟“@ngrx/effects”中的操作。

代码语言:javascript
复制
const actions = new Subject();

然后在测试模块的提供者中

代码语言:javascript
复制
{ provide: Actions, useValue: actions }

在单元测试中,当您需要触发某些效果时,订阅您的效果来测试您预期的操作/行为。然后简单调用actions.next(新的TriggerAction())。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51733749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档