Жасмин Жди Наблюдаемой Подписки - PullRequest
0 голосов
/ 04 марта 2020

У меня есть следующий класс:

@Injectable()
export class MyService {
  private subscriptions: { [key: string]: Subscription } = {};

  constructor(private otherService: OtherService) {
  }

  public launchTimer(order: any): void {
    this.subscriptions[order.id] = timer(500, 300000).subscribe(
      () => {
        this.otherService.notify();
      },
    );
  }
}

Я хотел бы написать модульный тест, который утверждает, что при вызове launchTimer () , notify вызывается метод OtherService . Хитрость заключается в том, что подписка на наблюдаемый timer осуществляется непосредственно в методе, что означает, что я не могу сделать подписку непосредственно в модульном тесте, чтобы выполнить утверждение. До сих пор я придумал следующий тест, который не прошел, потому что утверждение сделано до подписки:

class OtherServiceMock {
  public notify(): void {}
}

describe('MyService', () => {
  let otherService: OtherServiceMock;
  let myService: MyService;
  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        { provide: OtherService, useClass: OtherServiceMock },
      ],
    });
    otherService = TestBed.get(OtherService);
    myService = TestBed.get(MyService);
  });

  it('launchTimer should call notify', () => {
    spyOn(otherService, 'notify');
    myService.launchTimer();
    expect(otherService.notify).toHaveBeenCalled();
  });
});

Я попытался обернуть функцию с помощью asyn c и я также использовал fakeAsyn c с галочкой , но, похоже, ничего не работает. Любые идеи, как я могу ждать подписку, прежде чем сделать утверждение?

1 Ответ

2 голосов
/ 04 марта 2020

Тестирование наблюдаемых с интервалом и таймером может быть сложным, но попробуйте это, если это не сработает, возможно, я могу сделать это и по-другому.

class OtherServiceMock {
  public notify(): void {}
}

describe('MyService', () => {
  let otherService: OtherServiceMock;
  let myService: MyService;
  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        { provide: OtherService, useClass: OtherServiceMock },
      ],
    });
    otherService = TestBed.get(OtherService);
    myService = TestBed.get(MyService);
  });

  it('launchTimer should call notify', fakeAsync(() => {
    // you're going to have to make `subscriptions` public for this to work !!
    spyOn(otherService, 'notify'); // don't need to callThrough to see if it was called or not
    myService.launchTimer({id: 1});
    tick(501);
    expect(otherService.notify).toHaveBeenCalled();
    myService.subscriptions['1'].unsubscribe(); // kill the timer subscription
  }));
});

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

Вам придется либо сделать subscriptions publi c, либо предоставить publi c способ отказаться от подписки на этот объект.

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