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

NgRx效果:单元测试-似乎操作永远不会产生效果

NgRx是一个用于构建响应式应用程序的状态管理库,它基于Redux模式。NgRx提供了一种在Angular应用程序中管理状态的方式,通过将应用程序的状态存储在一个单一的可预测的状态树中,并使用纯函数来处理状态的变化。

在NgRx中,效果(Effect)是一种用于处理副作用的机制。副作用是指与应用程序状态无关的操作,例如异步请求、访问浏览器缓存或本地存储、与服务器通信等。效果允许我们在响应状态变化时执行这些副作用。

对于NgRx效果的单元测试,我们可以采取以下步骤:

  1. 创建一个测试套件,并导入所需的测试工具和依赖项。
  2. 创建一个测试用例,并在该测试用例中创建一个效果实例。
  3. 设置测试用例的初始状态和预期结果。
  4. 使用测试工具模拟应用程序状态的变化,例如发出一个动作。
  5. 使用测试工具调度效果,并等待效果的执行。
  6. 使用断言来验证预期结果是否与实际结果匹配。

以下是一个示例测试用例:

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

import { MyEffect } from './my.effect';
import { MyService } from './my.service';
import { MyAction, MySuccessAction } from './my.actions';

describe('MyEffect', () => {
  let effect: MyEffect;
  let actions$: Observable<any>;
  let myService: jasmine.SpyObj<MyService>;
  let scheduler: TestScheduler;

  beforeEach(() => {
    const spy = jasmine.createSpyObj('MyService', ['getData']);
    TestBed.configureTestingModule({
      providers: [
        MyEffect,
        provideMockActions(() => actions$),
        { provide: MyService, useValue: spy }
      ]
    });
    effect = TestBed.inject(MyEffect);
    actions$ = TestBed.inject(Actions);
    myService = TestBed.inject(MyService) as jasmine.SpyObj<MyService>;
    scheduler = new TestScheduler((actual, expected) => {
      expect(actual).toEqual(expected);
    });
  });

  it('should dispatch MySuccessAction on successful data retrieval', () => {
    const data = { id: 1, name: 'Test' };
    const action = new MyAction();
    const completion = new MySuccessAction(data);

    scheduler.run(({ hot, cold, expectObservable }) => {
      actions$ = hot('-a', { a: action });
      myService.getData.and.returnValue(of(data));

      expectObservable(effect.myEffect$).toBe('--b', { b: completion });
    });
  });
});

在这个示例中,我们创建了一个测试套件,并使用provideMockActions提供了一个模拟的actions$流。我们还创建了一个MyService的模拟对象,并使用jasmine.createSpyObj创建了一个myService的间谍对象。

在测试用例中,我们设置了一个初始动作MyAction和预期的结果MySuccessAction。然后,我们使用TestScheduler来模拟时间的流逝,并使用expectObservable来验证预期结果。

这只是一个简单的示例,你可以根据实际情况扩展和修改测试用例。对于NgRx效果的单元测试,你可以使用类似的方法来测试其他副作用,例如处理错误、调度其他动作等。

关于NgRx效果的更多信息,你可以参考腾讯云相关产品和产品介绍链接地址。

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

相关·内容

领券