Тестирование сервиса Angular 9 с использованием Jest и Testbed - PullRequest
0 голосов
/ 15 апреля 2020

В моем Angular 9 проекте я добавил jest и удалил Jasmine и Karma.

Я тестирую сервис с именем CorrectionService, который имеет зависимость от сервиса RemoteService.

Я хочу шпионить за RemoteService, чтобы узнать, вызывается ли метод. Я успешно сделал это путем насмешки вручную с помощью jest RemoteService.

Теперь я хочу использовать TestBed. Мой предыдущий тест по Жасмину такой:

import { TestBed } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { HttpClient } from '@angular/common/http';
import { CorrectionService } from './correction.service';
import { Answer, Question } from './setting';
import { IChoosed } from './question/question.component';
import { RemoteService } from './remote.service';


describe('CorrectionService', () => {
  let service: CorrectionService;
  let remoteServiceSpy: jasmine.SpyObj<RemoteService>

  beforeEach(() => {
    const spy = jasmine.createSpyObj('RemoteService', ['saveToRemoteAdditionalData']);
    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
      providers: [
        CorrectionService,
        {provide: RemoteService, useValue: spy}
      ]
    });
    service = TestBed.inject(CorrectionService);
    remoteServiceSpy = TestBed.inject(RemoteService) as jasmine.SpyObj<RemoteService>;
  });

Я пытался использовать jest макет следующим образом:

import { TestBed } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { HttpClient, HttpHandler } from '@angular/common/http';
import { CorrectionService } from './correction.service';
import { Answer, Question } from './setting';
import { IChoosed } from './question/question.component';
import { RemoteService } from './remote.service';


describe('CorrectionService', () => {
  let service: CorrectionService;
  this.remoteServiceStub = {} as RemoteService;

  beforeEach(() => {
    this.remoteServiceStub = {saveToRemoteAdditionalData: jest.fn()};

    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
      providers:[
        CorrectionService,
        {provide:RemoteService, useValue: this.remoteServiceStub}
      ]
    });
    this.service = TestBed.inject(CorrectionService);
    TestBed.inject(RemoteService);
  });

Но тесты не работают, и я получил:

 Can't resolve all parameters for CorrectionService: (?).

Полагаю, RemoteService не вводится. Что я делаю не так?

1 Ответ

0 голосов
/ 15 апреля 2020

Я нашел проблему, у меня был неуместный атрибут emitDecoratorMetadata в tsconfig.spec.json. Это не было в compilerOptions.

Я пишу полное содержание файла здесь для дальнейшего использования:

{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "./out-tsc/spec",
    "types": [
      "jest",
      "node"
    ],
  "emitDecoratorMetadata": true,
  },
  "files": [
    "src/test.ts",
    "src/polyfills.ts"
  ],
  "esModuleInterop": true,
  "include": [
    "src/**/*.spec.ts",
    "src/**/*.d.ts"
  ]
}
...