В чем разница между провайдерами и объявлениями на TestBed - PullRequest
0 голосов
/ 13 февраля 2020

Я новичок в Angular. У меня есть несколько вопросов во время изучения TDD из Angular.

Насколько я знаю, TestModuleMetadata для Testbed.configureTestingModule - это объект, у которого есть поставщик, объявления и импорт и т. Д., Как объект для @ngModule .

Поэтому я подумал, что если я хочу протестировать компонент, все, что мне нужно сделать, это поместить компонент в провайдеры TestModuleMetaData.

Но это привело к ошибке типа «Нет провайдера для SomeComponent!» и 'StaticInjectorError [SomeComponent]:'

после этого я перемещаю someComponent поставщикам из объявлений, и он работает правильно.

Почему это происходит? Я думал, что декларации - это массив для компонентов, которые вы хотите использовать в модуле, а провайдеры - для службы.

Я ошибаюсь ??

    import { TestBed } from "@angular/core/testing";
    import { WelcomeComponent } from "./welcome.component";
    import { UserService } from "../user.service";

    describe("WelcomeComponent", () => {
      let comp: WelcomeComponent;
      let userService: UserService;

      beforeEach(() => {
        // This work correctly
        TestBed.configureTestingModule({
          providers: [UserService, WelcomeComponent]
        });

        // This doesn't work
        // TestBed.configureTestingModule({
        //   declarations: [WelcomeComponent],
        //   providers: [UserService]
        // });

        comp = TestBed.get(WelcomeComponent);
        userService = TestBed.get(UserService);
      });

      it("should not have welcome message after construction", () => {
        expect(comp.welcome).toBeUndefined();
      });

      it("should welcome logged in user after Angular calls ngOnInit", () => {
        comp.ngOnInit();
        expect(comp.welcome).toContain(userService.user.name);
      });

      it("should ask user to log in if not logged in after ngOnInit", () => {
        userService.isLoggedIn = false;
        comp.ngOnInit();
        expect(comp.welcome).not.toContain(userService.user.name);
        expect(comp.welcome).toContain("log in");
      });
    });

1 Ответ

0 голосов
/ 13 февраля 2020

В вашем тестовом коде у вас есть:

comp = TestBed.get(WelcomeComponent);

Это для поиска сервисов, которые уже созданы. Вместо этого вам нужно создать свой компонент:

comp = TestBed.createComponent(WelcomeComponent);
...