Я новичок в 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");
});
});