首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ngrx/effects使用jasmine-marble进行单元测试

ngrx/effects是一个用于处理副作用的库,它是Angular应用中的一个重要模块。它提供了一种声明式的方式来管理和处理异步操作,例如HTTP请求、定时器、WebSocket等。

Jasmine Marble是Jasmine框架的一个扩展,它为ngrx/effects提供了一种简洁而强大的方式来进行单元测试。它基于RxJS的marble diagram概念,使得测试异步操作变得更加直观和可维护。

在使用Jasmine Marble进行单元测试时,我们可以通过创建虚拟的时间线来模拟异步操作的发生和完成。这样可以确保我们的副作用逻辑在正确的时间点被触发,并且可以方便地验证副作用的输出。

下面是一个使用Jasmine Marble进行ngrx/effects单元测试的示例:

代码语言:typescript
复制
import { TestBed } from '@angular/core/testing';
import { provideMockActions } from '@ngrx/effects/testing';
import { Observable, of } from 'rxjs';
import { TestScheduler } from 'rxjs/testing';

import { MyEffects } from './my.effects';
import { MyService } from './my.service';
import { LoadData, LoadDataSuccess } from './my.actions';

describe('MyEffects', () => {
  let effects: MyEffects;
  let actions$: Observable<any>;
  let scheduler: TestScheduler;

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

    effects = TestBed.inject(MyEffects);
    actions$ = TestBed.inject(Actions);
    scheduler = new TestScheduler((actual, expected) => {
      expect(actual).toEqual(expected);
    });
  });

  it('should load data successfully', () => {
    const service = TestBed.inject(MyService);
    const data = { id: 1, name: 'John' };
    const action = new LoadData();
    const completion = new LoadDataSuccess(data);

    scheduler.run(({ cold, hot, expectObservable }) => {
      actions$ = hot('-a', { a: action });
      const response = cold('-b|', { b: data });
      service.getData.and.returnValue(response);

      expectObservable(effects.loadData$).toBe('--c', { c: completion });
    });
  });
});

在上面的示例中,我们首先创建了一个TestScheduler实例,它将用于模拟时间的流逝。然后,我们创建了一个虚拟的actions$流,用于模拟ngrx/effects中的action触发。接下来,我们使用冷/热Observable来模拟异步操作的输入和输出。最后,我们使用expectObservable来验证副作用的输出是否符合预期。

需要注意的是,我们在测试中使用了provideMockActions来提供虚拟的actions$流,以及使用jasmine.createSpyObj来创建一个虚拟的MyService实例。这样可以确保我们的测试只关注于MyEffects的逻辑,而不依赖于真实的服务和数据。

总结起来,ngrx/effects使用Jasmine Marble进行单元测试可以帮助我们更加直观和可靠地验证副作用的逻辑。它提供了一种简洁而强大的方式来模拟异步操作,并且可以方便地验证副作用的输出。在实际项目中,我们可以结合Jasmine Marble和其他测试工具来编写全面的单元测试,以确保我们的ngrx/effects逻辑的正确性和稳定性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的沙龙

领券