Разница между ChangeDetectorRef.detectChanges и fixture.detectChanges - PullRequest
0 голосов
/ 26 августа 2018

Допустим, у нас есть компонент - MyComponent с OnPush стратегией обнаружения изменений, который вводит ChangeDetectorRef, чтобы вручную вызвать detectChanges() (например, внутри подписок или где-то еще).

И у нас также есть тест для этого компонента.Поэтому, когда мы получаем экземпляр fixture = TestBed.createComponent(MyComponent) - мы также можем запустить detectChanges() для выполнения привязки данных в наших тестах.

Мой вопрос - в чем разница между этими двумя методами в обоих случаях?Можем ли мы получить тот же результат, если я вызову component.changeDetecotrRef.detectChanges() в тестах вместо fixture.detectChanges()?

1 Ответ

0 голосов
/ 26 августа 2018

Технически они делают то же самое, но changeDetecotrRef.detectChanges() - это часть функциональности компонента, в то время как fixture.detectChanges() - это прокладка для тестирования.

Разница в том, что changeDetecotrRef.detectChanges() запускает обнаружение изменений в скомпилированном приложении Angular, а fixture.detectChanges() запускает обнаружение изменений в тестовой среде. Первый предназначен для работы с полностью скомпилированным приложением Angular, а второй - с устройством, предназначенным для эмуляции полного приложения Angular.

Правило № 1 модульного тестирования - не изменять код для соответствия тесту, поэтому используйте changeDetecotrRef.detectChanges() в коде компонента, когда вам необходимо обнаружение изменений, чтобы компонент функционировал, и используйте fixture.detectChanges() для проверки теста, когда ожидается обнаружение изменений (который почти всегда используется для тестирования обновлений пользовательского интерфейса).

...