Жасмин - ожидайте, что после шпиона returnValue не удастся - PullRequest
0 голосов
/ 26 февраля 2020

У меня проблема со вторым оператором expect после изменения возвращаемого значения метода фиктивного сервиса. Я пробовал fakeAsync и Жасмин done, но все равно не получается, он работает только с setTimeout, от которого я, очевидно, хочу избавиться.

Не работает:

// AppComponent.ts
export class AppComponent implements OnInit {
  constructor(private authService: AppAuthService) {}

  ngOnInit() {
    this.checkAvailableCalculators();
  }

  private checkAvailableCalculators() {
    if (this.authService.isLoggedIn()) {
      this.authService.getAvailableCalculators();
    }

    this.authService.getSessionEvents().subscribe(e => {
      if (e === SESSION_EVENTS.login) {
        this.authService.getAvailableCalculators();
      }
    });
  }
}

// AppComponent.spec.ts
    const authServiceMock = {
      getSessionEvents: jasmine.createSpy('getSessionEventsSpy').and.returnValue(of()),
      getAvailableCalculators: jasmine.createSpy('getAvailableCalculators')
    };

    beforeEach(async(() => {
      TestBed.configureTestingModule({
        imports: [],
        providers: [{provide: AppAuthService, useValue: authServiceMock}],
        declarations: [AppComponent]
      }).compileComponents();
    }));

    it('should check for available calculators after login', fakeAsync(() => {
      component.ngOnInit();

      expect(authServiceMock.getAvailableCalculators).not.toHaveBeenCalled();

      authServiceMock.getSessionEvents.and.returnValue(of(SESSION_EVENTS.login));
      tick(1000);

      expect(authServiceMock.getAvailableCalculators).toHaveBeenCalled(); // <=== FAILS
    }));

Рабочая:


    it('should check for available calculators after login', () => {
      component.ngOnInit();

      expect(authServiceMock.getAvailableCalculators).not.toHaveBeenCalled();

      authServiceMock.getSessionEvents.and.returnValue(of(SESSION_EVENTS.login));

      setTimeout(() => expect(authServiceMock.getAvailableCalculators).toHaveBeenCalled(), 1000); // <=== PASSES
    });

1 Ответ

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

Я не вижу код вашего компонента, но делаю снимок в темноте, попробуйте следующее:

fixture.whenStable() ожидает выполнения обещаний.

it('should check for available calculators after login', async(done) => {
      component.ngOnInit();

      expect(authServiceMock.getAvailableCalculators).not.toHaveBeenCalled();

      authServiceMock.getSessionEvents.and.returnValue(of(SESSION_EVENTS.login));
      await fixture.whenStable();
      expect(authServiceMock.getAvailableCalculators).toHaveBeenCalled(); 
      done();
    });

=== ===================================================== Редактировать == ============

Попробуйте это сейчас:

// AppComponent.spec.ts
    const authServiceMock = {
      getSessionEvents: jasmine.createSpy('getSessionEventsSpy'),
      getAvailableCalculators: jasmine.createSpy('getAvailableCalculators')
    };
    let component: AppComponent;
    let fixture: ComponentFixture<AppComponent>;

    beforeEach(async(() => {
      TestBed.configureTestingModule({
        imports: [],
        providers: [{provide: AppAuthService, useValue: authServiceMock}],
        declarations: [AppComponent]
      }).compileComponents();
    }));

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

   describe('getSessionEvents returning login', () => {
     beforeEach(() => {
      // mock getSessionEvents before ngOnInit is called
      authServiceMock.getSessionEvents.and.returnValue(of(SESSION_EVENTS.login));
      fixture.detectChanges(); // !! After this fixture.detectChanges, ngOnInit 
      will be called, no need to call it explicitly.
     });

     it('should check for available calculators after login', () => {
      expect(authServiceMock.getAvailableCalculators).toHaveBeenCalled(); 
    });
   });

  describe('getSessionEvents returning anything else you want', () => {
    beforeEach(() => {
      authServiceMock.getSessionEvents.and.returnValue(of('anything else'));
      fixture.detectChanges();
    });

    it('should not call getAvailableCalculators', () => {
      expect(authServiceMock.getAvailableCalculators).not.toHaveBeenCalled();
    });
  });

Оператор of может быть слишком поздно с вашей реализацией. Оператор of не выводит значение sh, просто укажите это значение при следующей подписке. Дайте мне знать, если это работает.

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