Должен ли я написать модульный тест для простого взаимодействия с RxJS

#angular #typescript #unit-testing #rxjs

#angular #typescript #модульное тестирование #rxjs

Вопрос:

Допустим, у нас есть простой класс, который отправляет новое событие для объекта RxJS в событии window.resize. Не обращайте внимания, что, возможно, это слишком сложно. Ключевым моментом является то, что этот класс генерирует некоторое событие.

         export class ResizeService {
          private resizeSubject = new Subject();

          public onResize(): Observable<Window> {
            return this.resizeSubject.asObservable();
          }

          constructor(private eventManager: EventManager) {
            this.eventManager.addGlobalEventListener('window', 'resize', (e) => {
              this.resizeObject.next(<Window>event.target)   
            })
          }

          private onResize(event: UIEvent) {
            this.resizeObject.next(<Window>event.target);
          }
        }
  

Вопрос в том, говоря о модульных тестах для этого класса, должны ли мы проверить, действительно ли новое событие, которое мы отправляем субъекту RxJS, будет получено клиентом, который вызвал метод onResize . Что-то вроде этого:

 it('should emit a value', fakeAsync(() => {
     let subscriptionWorks = false;
     fireWindowResizeEvent(new Event({width: 600; height: 400});
     resizeService.onResize().subscribe(() => subscriptionWorks = true);
     expect(subscriptionWorks).toBeTruthy();
  })
)
  

И затем, в случае, если какой-либо разработчик изменит onResizeMethod на этот, тест завершится неудачей:

 public onResize(): Observable<Window> {
  return this.resizeSubject.asObservable().skip(10);
}
  

Комментарии:

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

2. @nircraft, и как я должен это протестировать, если я не могу повлиять на свою тему, как это private есть? Мое предложение где-то извне, имитирующее поведение какого-то клиента.

Ответ №1:

То, что, я думаю, вы описываете, на самом деле является интеграционным тестом между вашим ResizeService и вашим клиентом. Так что нет, вы этого не делаете. Нет необходимости в модульном тестировании этого.

Комментарии:

1. Я полагаю, вы имели в виду «не нужно этого модульного теста». В любом случае это должно быть протестировано (возможно, не в терминах модульного тестирования, а в интеграционном), и мы не должны просто игнорировать этот код. Правильно ли это?