Angular 8: была создана платформа с другой конфигурацией. Пожалуйста, сначала уничтожь - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь протестировать этот простой тестовый сервис, который в основном предоставляет магический номер c через API getMagicNumber. Это конструктор, который вводит волшебный номер c через токен впрыска, который предоставляется на уровне платформы Injector.

Но при выполнении модульных тестов для Test Service я получаю следующую ошибку

Chrome 79.0.3945 (Windows 10.0.0) ОШИБКА Произошла ошибка afterAll Ошибка: Создана платформа с другой конфигурацией. Пожалуйста, сначала уничтожь это. в assertPlatform (http://localhost: 9876 / _karma_webpack_ / webpack: /node_modules/@angular/core/fesm2015/core.js: 31506: 1 ) в http://localhost: 9876 / _karma_webpack_ /webpack:/node_modules/@angular/core/fesm2015/core.js:31489:1 в Module ../ src / main.ts (http://localhost: 9876 / _karma_webpack_ / webpack: / src / main.ts: 11: 23 ) в webpack_require (http://localhost: 9876 / _karma_webpack_ / webpack: / webpack / bootstrap: 78: 1 ) в Модуль ../ src / app / test.service.ts (http://localhost: 9876 / _karma_webpack_ / main. js: 452: 66 ) в webpack_require ( http://localhost: 9876 / _karma_webpack_ / webpack: / webpack / bootstrap: 78: 1 ) в модуле ../ src / app / test.service.spe c .ts (http://localhost : 9876 / _karma_webpack_ / webpack: /src/app/test.service.spec.ts: 1: 1 )
в webpack_require (http://localhost: 9876 / _karma_webpack_ / webpack: / webpack / bootstrap: 78: 1 ) в webpackContext (http://localhost: 9876 / _karma_webpack_ / webpack: / sr c syn c .spe c .ts $: 9: 1) Chrome 79.0.3945 (Windows 10.0.0): выполнено 3 из 3 ОШИБКА (0,146 с / 0,127 с)

Вот модульный тест из файла test.service.spe c .ts

    import { TestBed, inject } from "@angular/core/testing";
import { TestService } from "./test.service";
import { MAGIC_NUMBER } from "src/main";

describe("Testing Test Service", () => {
  testService: TestService;
  beforeEach(() => {
    TestBed.configureCompiler({
      providers: [
        {
          provide: MAGIC_NUMBER,
          useValue: 007
        },
        TestService
      ]
    });

    this.testService = TestBed.get(TestService);
  });
  it("Should create TestService", () => {
    expect(this.testService).toBeTruthy();
  });
});

Вот код службы тестирования

import { Injectable, Inject } from "@angular/core";
import { MAGIC_NUMBER } from "src/main";

@Injectable({ providedIn: "root" })
export class TestService {
  constructor(@Inject(MAGIC_NUMBER) private magicNumber) {}
  getMagicNumber() {
    return this.magicNumber;
  }
}

Я получаю вышеуказанную ошибку, если добавляю эту строку кода в файл test.service.spe c .ts

 TestBed.configureTestingModule({
      providers: [
        {
          provide: MAGIC_NUMBER,
          useValue: 007
        },
        TestService
      ]
    });

Как исправить эту проблему. Вот ссылка на исходный код. ссылка на исходный код

1 Ответ

1 голос
/ 02 февраля 2020

Вы импортируете MAGIC_NUMBER из src/main, но в src/main у вас есть следующее:

platformBrowserDynamic([
  {
    provide: MAGIC_NUMBER,
    useValue: 111
  }
])
  .bootstrapModule(AppModule)
  .catch(err => console.error(err));

, которые настраивают платформу. Обратите внимание, что когда вы импортируете файл или его член, может возникнуть побочный эффект. Таким образом, вы загружаете свое приложение. Но тестовая среда уже сделает это за вас. Вот почему у вас есть ошибка. Невозможно bootstrap дважды подать заявку. Чтобы решить эту проблему, необходимо переместить объявление токена за пределы src/main.

Например, вы можете создать src/app/token.ts.

import {InjectionToken} from "@angular/core";

export const MAGIC_NUMBER = new InjectionToken<{}>("MAGIC_NUMBER");

и импортировать это как:

import { MAGIC_NUMBER } from "./token";

Более того, вы хотите создать контекст, который делегирует создание экземпляров необходимых классов Angular. Замените TestBed.configureCompiler на TestBed.configureTestingModule.

 TestBed.configureTestingModule({
  providers: [
    {
      provide: MAGIC_NUMBER,
      useValue: 007
    },
    TestService
  ]
});

Я также заметил некоторые ошибки в вашем тестовом файле, я собираюсь сделать PR в вашем репозитории github.

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