Как отменить подписку на тестовый модуль в Angular и Jasmine? - PullRequest
0 голосов
/ 17 сентября 2018

В моем компоненте есть частные члены класса, например

private querySubscription: Subscription;.

В моем ngOnDestroy() я отписался от подписки:

ngOnDestroy(): void { this.querySubscription.unsubscribe(); this.userSettingsSubscription.unsubscribe(); }

Как мне проверить, действительно ли я правильно отписался в моем модульном тесте в жасмине?Я могу программно вызвать ngOnDestory(), потому что он общедоступный, но я не могу проверить своих частных учеников.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

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

Stackblitz

  it('should unsubscribe on destroy', () => {
    component['querySubscription'] = of(true).subscribe();

    component.ngOnDestroy();

    expect(component['querySubscription'].closed).toBeTruthy();
  });

EDIT 1

Это решение работает из-за записи в массиве.В javascript у вас нет личных или общедоступных переменных: у вас есть только переменные.

Typescript заставляет вас соблюдать private / public, но вы всегда можете обойти это.

Если вы не хотите этого делать, вы должны создать публичную функцию, которая создает подписку, например, так:

createSubscription() {
  this.querySubscription = this.someFunction().subscribe();
}

Это единственное другое жизнеспособное решение, если вы не хотите использоватьзапись массива (что, как я забыл упомянуть, совсем не плохая практика).

Вам решать, какой из них вы предпочитаете!

0 голосов
/ 17 сентября 2018

Если вы используете Typescript, и я полагаю, что при настройке testBed вы должны тестировать приватных участников в своем тестовом модуле, вам необходимо вызвать сервис с помощью инжектора.

beforeEach(() => {
    TestBed.configureTestingModule({
        providers: [
            YourService,
        ],
        imports: [ HttpClientTestingModule ],
    });
    const injector = getTestBed();
    service = injector.get(YourService);
}); 

Теперь вы можете получить доступ к своему сервису.публичные методы с использованием service.myMethod и ваши приватные с использованием (service as any).privateMethod().

Поскольку машинопись всегда компилируется в JavaScript, а в JavaScript у вас нет открытых закрытых членов, вам нужно использовать конструкцию (service as any).

РЕДАКТИРОВАТЬ 1

После того, как вы сможете получить доступ к частному лицу, вы можете получить доступ к его свойствам, так что вы затем делаете (в псевдокоде):

    spyOn((service as any).privateMethod, 'setBar');

    service.ngOnDestroy()

    expect((service as any).privateMethod.setBar).toHaveBeenCalled();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...