在ngRX效果中测试forkJoin,可以按照以下步骤进行:
forkJoin.effects.spec.ts
。forkJoin
操作符、测试工具和ngRX的EffectsTestingModule
。import { TestBed } from '@angular/core/testing';
import { provideMockActions } from '@ngrx/effects/testing';
import { Observable, of } from 'rxjs';
import { forkJoin } from 'rxjs';
import { EffectsTestingModule, EffectsRunner } from '@ngrx/effects/testing';
import { MyEffects } from './my.effects';
import { MyService } from './my.service';
import { MyAction, MySuccessAction } from './my.actions';
describe('MyEffects', () => {
let runner: EffectsRunner;
let myEffects: MyEffects;
let myService: MyService;
let actions$: Observable<any>;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
EffectsTestingModule
],
providers: [
MyEffects,
provideMockActions(() => actions$),
{
provide: MyService,
useValue: jasmine.createSpyObj('myService', ['getData'])
}
]
});
runner = TestBed.get(EffectsRunner);
myEffects = TestBed.get(MyEffects);
myService = TestBed.get(MyService);
actions$ = runner.actions;
});
it('should call forkJoin and dispatch success action', () => {
const data1 = { id: 1, name: 'John' };
const data2 = { id: 2, name: 'Jane' };
const expectedAction = new MySuccessAction([data1, data2]);
myService.getData.and.returnValue(forkJoin([of(data1), of(data2)]));
runner.queue(new MyAction());
myEffects.getData$.subscribe(result => {
expect(result).toEqual(expectedAction);
});
});
});
在上述代码中,我们首先导入了所需的依赖项和模块。然后,在beforeEach
块中,我们使用TestBed.configureTestingModule
方法配置测试环境。我们提供了MyEffects
作为要测试的效果类,使用provideMockActions
方法提供了一个可观察的动作流。我们还提供了一个模拟的MyService
,并使用jasmine.createSpyObj
方法创建了一个间谍对象,以便我们可以模拟getData
方法的行为。
在测试用例中,我们使用it
块定义了一个测试用例,它测试了forkJoin
操作符是否被调用,并且是否正确地分派了成功的动作。我们模拟了getData
方法返回一个forkJoin
的可观察对象,该对象发出了两个数据项。然后,我们使用runner.queue
方法将一个MyAction
动作放入动作流中。最后,我们订阅了myEffects.getData$
,并断言结果是否与预期的成功动作相等。
这样,我们就完成了在ngRX效果中测试forkJoin
的过程。根据具体的业务需求,你可以根据这个示例进行扩展和修改。
云+社区沙龙online [新技术实践]
云原生正发声
算法大赛
企业创新在线学堂
云+社区技术沙龙[第9期]
DB TALK 技术分享会
DBTalk技术分享会
GAME-TECH
领取专属 10元无门槛券
手把手带您无忧上云