Angular Effects-如何获得100%的测试结果(以funcs覆盖)? [英] Angular Effects - how to get 100 percent test result (coverage in funcs )?

查看:82
本文介绍了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%涵盖的功能.有什么帮助我吗?

works fine. but getting only 40% of Funcs from the above. looking for 100% of funcs covered. any help me?

推荐答案

我不使用弹珠来测试效果(诸如魔术和陡峭的学习曲线之类的感觉).

I don't use marbles for testing effects (feels like magic and steep learning curve).

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));
      });
    });
  });
});

我认为这应该可行.

这篇关于Angular Effects-如何获得100%的测试结果(以funcs覆盖)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆