Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Unit tests on javascript (https://javascript.ru/forum/misc/54625-unit-tests-javascript.html)

tsigel 25.03.2015 14:20

Unit tests on javascript
 
Решил таки добраться до тестирования. Сам люблю TypeScript, собрал тестовую среду (karma + mocha + require + expect.js + source-map-support), все было хорошо пока не начал тестировать один из модулей связанных с window.location. На сколько я понял - основной принцип тестирования - переопределить что-то заменить на своё, но при попытке заменить window.location на свой объект я получаю ошибку "TypeError: Cannot redefine property: location". Отсюда вопрос: как вообще принято тестировать модули, работа которых завязана на непереопределяемые методы window? Не хочется делать прослойку которая бы выдавала location только ради тестов.

tsigel 25.03.2015 15:02

Ну вообщем пока что я передаю ему location в конструктор.

nerv_ 25.03.2015 15:12

1. тему надо было создавать в серверном js
2. если я правильно понял, тебе нужена эмуляция браузера на сервере. Используй karma-phantomjs-launcher или другой движок/драйвер_браузера
Пример можешь посмотреть у меня в репе https://github.com/nervgh/recursive-iterator

tsigel 25.03.2015 15:16

nerv_,
Так у меня уже используется карма, которая запускает хром.

Почему на сервере? Вполне на клиенте, я же тестирую клиентский код.

Сейчас почитаю, спасибо!

nerv_ 25.03.2015 15:22

Цитата:

Сообщение от tsigel
я же тестирую клиентский код

с помощью серверного яваскрипта =)

Цитата:

Сообщение от tsigel
Отсюда вопрос: как вообще принято тестировать модули, работа которых завязана на непереопределяемые методы window?

так, стоп. Зачем тебе window тестировать? :D

Цитата:

Сообщение от tsigel
все было хорошо пока не начал тестировать один из модулей связанных с window.location

каким образом связан? Следить за хешем?

tsigel 25.03.2015 15:25

Цитата:

Сообщение от nerv_
каким образом связан? Следить за хешем?

Ну типа того, посмотреть что он правильно оттуда данные получает. При этом методы которые начинают разбирать строку приватны и не хочется их дергать напрямую, хочется тестировать только публичное АПИ.

nerv_ 25.03.2015 15:31

Цитата:

Сообщение от tsigel
Ну типа того, посмотреть что он правильно оттуда данные получает

подсунь ему строки, кот. может содержать хеш и разбирай их

Сейчас ты пытаешься установить значение хеша?
location.hash = 12;

должно работать)

melky 28.03.2015 13:41

Цитата:

Сообщение от tsigel
а сколько я понял - основной принцип тестирования - переопределить что-то заменить на своё, но при попытке заменить window.location на свой объект я получаю ошибку "TypeError: Cannot redefine property: location".

:lol:
я тоже мегастабами страдал (это норма, как говорится)

серьёзно говоря: ты преувеличил то, что надо "заменять на своё" (т.е. создавать stub'ы)

Цитата:

Сообщение от tsigel
Отсюда вопрос: как вообще принято тестировать модули, работа которых завязана на непереопределяемые методы window? Не хочется делать прослойку которая бы выдавала location только ради тестов

принцип "чёрного ящика". плевать шо оно там делает, к чему обращается - проверяй вход и выход данных публичного API (короче говоря, пиши интеграционные тесты, которые тестируют >1 модуля за раз)

либо тест одного модуля - выноси привязку к location в отдельный компонент и делай его stub в тесте.


Часовой пояс GMT +3, время: 07:53.