Проблема с инъекционным сервисом в тесте при переходе с Jasmine-Karma на Jest - PullRequest
0 голосов
/ 22 января 2019

У меня есть тест, который отлично работает в Jasmine-Karma, но не проходит в Jest из-за проблемы с тем, как я внедряю сервис.

accessrequest.service.ts

import { Injectable } from "@angular/core";
import { Observable } from "rxjs";
import { map } from 'rxjs/operators';
import { Store } from "@ngrx/store";

import { AppStore } from "../../../core/store/app.store";
import { CWPUrlConstants } from '../../../core/constants/urls';

import { AccessRequest } from "../datamodels/accessrequest";
import {
    SetAccessRequestsAction,
} from "../actions/accessrequests.actions";
import { DataService } from "./data.service";

@Injectable()
export class AccessRequestService {
    private static hasBeenInitialized = false;

    constructor(private dataService: DataService, private store: Store<AppStore>) {
    }

    refreshAllRequests(): void {
        this.dataService.get(CWPUrlConstants.ACCESS_REQUESTS).pipe(
            map(payload => new SetAccessRequestsAction(payload)))
            .subscribe(
                action => this.store.dispatch(action)
            );
    }

    getRequests(): Observable<Array<AccessRequest>> {
        if (!AccessRequestService.hasBeenInitialized) {
            this.refreshAllRequests();
            AccessRequestService.hasBeenInitialized = true;
        }
        return this.store.select(store => store.cwp_reducer.accessRequests);
    }
}

accessrequest.service.spec.ts

import { EMPTY, of as observableOf, Observable } from 'rxjs';
import { inject, TestBed } from "@angular/core/testing";
import { Store } from "@ngrx/store";

import { AccessRequest } from "../datamodels/accessrequest";
import { AccessRequestService } from "./accessrequest.service";
import { AccessRequestsActions } from "../actions/accessrequests.actions";
import { DataService } from "./data.service";

class MockStore {
    private requests: AccessRequest[] | string;

    select<T>(key: string): Observable<{}> {
        if (key === "accessRequests" && this.requests) {
            return observableOf(this.requests);
        } else {
            return observableOf({} as AccessRequest);
        }
    }

    dispatch(action: AccessRequestsActions): void {
        this.requests = action.payload;
    }
}

class MockDataService {
    post(): void {
        // mock
    }

    get() {
        return EMPTY;
    }
}

describe('Access request Service Tests', () => {
    beforeEach(() =>
        TestBed.configureTestingModule({
            providers: [
                AccessRequestService,
                {provide: Store, useClass: MockStore},
                {provide: DataService, useClass: MockDataService}
            ]
        })
    );

    it('should get accessRequests from store', inject([AccessRequestService], (accessRequestService) => {
        let accessRequest = accessRequestService.getRequests();
        expect(accessRequest).toBeDefined();
    }));

jest.config.js

module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'node',
  testMatch: ['**/+(*.)+(spec|test).+(ts|js)?(x)'],
  transform: {
    '^.+\\.(ts|js|html)$': 'jest-preset-angular/preprocessor.js'
  },
  moduleFileExtensions: ['ts', 'js', 'html'],
  collectCoverage: true,
  coverageReporters: ['html'],
  snapshotSerializers: [
    'jest-preset-angular/AngularSnapshotSerializer.js',
    'jest-preset-angular/HTMLCommentSerializer.js'
  ],
  verbose: true,
};

Когда я запускаю тесты, вышеприведенное приводит к ошибке TypeError: Cannot read property 'getComponentFromError' of null. Я обнаружил, что мне нужно добавить следующее, чтобы решить эту проблему:

accessrequest.service.spec.ts

import { BrowserDynamicTestingModule,
platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing';
...
describe(... {
    beforeEach(() => {
        TestBed.resetTestEnvironment();
        TestBed.initTestEnvironment(BrowserDynamicTestingModule,
           platformBrowserDynamicTesting());
    });
...});

но теперь выдается ошибка Can't resolve all parameters for AccessRequestService: (?, ?), которая, как я понимаю, является проблемой DI, но я не могу понять, как ее решить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...