angular - Angular Effects - 如何获得 100% 的测试结果(覆盖 funcs )?
问题描述
这是我的效果:
import { Injectable } from '@angular/core';
import { Action } from '@ngrx/store';
import { Actions, createEffect, ofType } from '@ngrx/effects';
import { of, Observable } from 'rxjs';
import { catchError, map, switchMap } from 'rxjs/operators';
import * as courseAttributeActions from '../actions/candidate-registration-management.action';
import { CandidateRegistrationManagementService } from '../../services/candidate-registration-management.service';
@Injectable()
export class CandidateRegistrationEffects {
constructor(
private actions$: Actions,
private courseAttributeService:
CandidateRegistrationManagementService) { }
/**
* getting assessment periods
*/
getAssessmentPeriods$: Observable<Action> = createEffect(() =>
this.actions$.pipe(
ofType(courseAttributeActions.getAssessmentPeriod_CR),
switchMap(() => this.courseAttributeService.getAssessmentPeriods()
.pipe(
map((value: any) => {
return courseAttributeActions.getAssessmentPeriodSuccess_CR({ payload: value });
}),
catchError(error => of(courseAttributeActions.LoadFailure_CR(error)))
))
));
}
规格文件:
import { cold, hot } from 'jasmine-marbles';
import { Observable, of } from 'rxjs';
import { CandidateRegistrationManagementService } from '../../services/candidate-registration-management.service';
import * as CRMActions from '../actions/candidate-registration-management.action';
import { CandidateRegistrationEffects } from './candidate-registration-management.effect';
describe("Candidate registration management effects", () => {
let actions: Observable<any> = of([]);
let CRMService: CandidateRegistrationManagementService;
let CRMEffects: CandidateRegistrationEffects;
it('should load and dispatch correctly for getAssessmentPeriods', () => {
const values = [];
const http = {
get: jest.fn(() => of(hot('--b|', { b: { payload: values } })))
};
CRMService = new CandidateRegistrationManagementService(http as any);
CRMEffects = new CandidateRegistrationEffects(actions, CRMService);
const action = CRMActions.getAssessmentPeriod_CR();
const completion = CRMActions.getAssessmentPeriodSuccess_CR({ payload: values });
const expected = of(cold('--b|', { b: completion }));
expect(CRMEffects.getAssessmentPeriods$).toBeTruthy();
})
})
工作正常。但从上面只得到 40% 的 Funcs。寻找 100% 覆盖的功能。有什么帮助我吗?
解决方案
我不使用弹珠来测试效果(感觉就像魔法和陡峭的学习曲线)。
class MockCourseAttributeService {
getAssessmentPeriods() {
return of({});
}
}
class MockCourseAttributeServiceError {
getAssessmentPeriods() {
return throwError('Service Failed');
}
}
describe('CandidateRegistrationEffects', () => {
let actions$: ReplaySubject<any>;
let effects: CandidateRegistrationEffects;
describe('Effects are successful', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [{ provide: CandidateRegistrationManagementService, useClass: MockCourseAttributeService }, CandidateRegistrationEffects, provideMockActions(() => actions$)],
});
effects = TestBed.get(CandidateRegistrationEffects);
actions$ = new ReplaySubject(1);
});
it('should load the assesment periods', () => {
actions$.next(courseAttributeActions.getAssessmentPeriod_CR());
effects.getAssessmentPeriods$.subscribe((value) => {
expect(value).toEqual(courseAttributeActions.getAssessmentPeriodSuccess_CR({ payload: value }));
});
});
});
describe('Effects are Failure', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [{ provide: CandidateRegistrationManagementService, useClass: MockCourseAttributeServiceError }, CandidateRegistrationEffects, provideMockActions(() => actions$)],
});
effects = TestBed.get(CandidateRegistrationEffects);
actions$ = new ReplaySubject(1);
});
it('Gender load Fails', () => {
actions$.next(courseAttributeActions.getAssessmentPeriod_CR());
effects.loadGender$.subscribe((error) => {
expect(error).toEqual(courseAttributeActions.LoadFailure_CR(error));
});
});
});
});
我认为这应该有效。
推荐阅读
- machine-learning - 多类案例的混淆矩阵,所有评估指标的估计
- javascript - OpenLayers6检测光标何时离开地图
- java - 适用于 Java 应用程序的 Amazon Kinesis Data Analytics:反序列化传入消息中的 Avro 问题
- tesseract - 从 tika-server 获取 hocr 输出
- java - 如何在启动 Intent 后保持 TextView 和 Button 不可见
- laravel - Laravel 发送多个 HTTP 响应
- ios - Flutter build ios bitcode问题,如何修复bitcode错误
- ios - Xcode 不能正确处理在 Main 包之外定义的命名颜色
- c - 结构数组的动态分配不起作用
- visual-studio-code - vscode 特定文件的键盘快捷键