Угловой 2 модульный тест всегда проходит, когда он должен потерпеть неудачу - PullRequest
0 голосов
/ 17 мая 2018

Я тестирую сервис, у которого в конструкторе есть метод checkName ().По какой-то причине, когда я пытаюсь протестировать метод checkName (), он всегда успешен, даже если тест не пройден.Однако, если я закомментирую метод в конструкторе, тест будет работать так, как должен, и не пройден.

Вот мои тесты для Service1:

describe('Service: Service1', () => {
  let service1: Service1;
  let service2: Service2;

  beforeEach(() => {
    routerStub = {
     navigate: jasmine.createSpy('navigate')
    };
    TestBed.configureTestingModule({
          providers: [
            Service1,
            {provide: Service2, useValue: Service2Stub},
            {provide: Router, useValue: routerStub}
          ]
        });
   service1 = TestBed.get(Service1);
   service2 = TestBed.get(Service2);
  });

  it('should fail', () => {
    spyOn(service2, 'getName').and.returnValue('test');
    service1.checkName();
    expect(routerStub.navigate).toHaveBeenCalledWith(['bad-name-page']);
  });

Вот Service1:

export class Service1 {
  constructor(private _service2: Service2) {
    this.checkName();
  }

  checkName(): void {
    const name = this._service2.getName();
    if (!name) {
      this._router.navigate(['bad-name-page']);
    }
  }
}

Возвращая 'test' из spyOn (service2, 'getName'), я ожидаю, что тест не пройдёт, потому что он должен переходить на страницу с плохим именем, когда имя не определено.Я добавил логирование до и после оператора if, и все выглядит нормально;name заполняется словом «test», и журналы внутри оператора if не выполняются, когда это имя действительно.

Однако, если я удалю this.checkName () из конструктора, этот тест завершится неудачно, как я и ожидал.

Почему использование this.checkName () в конструкторе вызывает проблемы с моими тестами и каков наилучший способ написания тестов методами конструктора?

Спасибо!

...