#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. Я полагаю, вы имели в виду «не нужно этого модульного теста». В любом случае это должно быть протестировано (возможно, не в терминах модульного тестирования, а в интеграционном), и мы не должны просто игнорировать этот код. Правильно ли это?