Угловой юнит тест опоры никогда не бывает неопределенным - PullRequest
0 голосов
/ 15 ноября 2018

Я не понимаю, почему этот простой тест не работает.

BannerComponent should not have welcome message after construction
Expected 'welcome' to be undefined.

// Компонент

@Component({
  selector: 'iwdf-banner',
  template: `
    <p>
      {{me}}
    </p>
  `,
  styles: []
})
export class BannerComponent implements OnInit {
  me: string;
  constructor() { }
  ngOnInit() {
    this.me = 'welcome';
  }
}

// Тест

describe('BannerComponent', () => {
  let component: BannerComponent;
  let fixture: ComponentFixture<BannerComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ BannerComponent ]
    })
    .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(BannerComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });

  it('should not have welcome message after construction', () => {
    expect(component.me).toBeUndefined();
  });

  it('should welcome logged in user after Angular calls ngOnInit', () => {
      component.ngOnInit();
      expect(component.me).toContain('welcome');
  });
});

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Вызов TestBed.createComponent вызовет конструктор компонента, но не хуки жизненного цикла.

Хук жизненного цикла OnInit будет вызываться при первом вызове fixture.detectChanges(), что вы делаете перед каждым тестом. Вот почему me имеет значение welcome вместо того, чтобы быть неопределенным.

Вы можете исправить это, удалив fixture.detectChanges() из beforeEach и переместив его в отдельные тесты, которые в нем нуждаются (и это будет все, кроме одного, если он не пройден). Вам не нужно вызывать ngOnInit вручную в последнем тесте после замены строки на fixture.detectChanges().

Вызов ngOnInit вручную может быть полезен, если вы хотите протестировать свой компонент без углового тестового стенда - тогда вам придется самостоятельно позаботиться о зависимостях и жизненных циклах, которые я не предлагаю.

0 голосов
/ 15 ноября 2018

Ну, TestBed запускает все необходимые ловушки жизненного цикла при обнаружении изменений. Таким образом, следует ожидать, что переменная определена. Не используйте fixture.detectChanges(). Тот запускает крюк.

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