Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.03.2015, 14:20
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

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

Ну вообщем пока что я передаю ему location в конструктор.
Ответить с цитированием
  #3 (permalink)  
Старый 25.03.2015, 15:12
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

1. тему надо было создавать в серверном js
2. если я правильно понял, тебе нужена эмуляция браузера на сервере. Используй karma-phantomjs-launcher или другой движок/драйвер_браузера
Пример можешь посмотреть у меня в репе https://github.com/nervgh/recursive-iterator
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #4 (permalink)  
Старый 25.03.2015, 15:16
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

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

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

Сейчас почитаю, спасибо!
Ответить с цитированием
  #5 (permalink)  
Старый 25.03.2015, 15:22
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от tsigel
я же тестирую клиентский код
с помощью серверного яваскрипта =)

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

Сообщение от tsigel
все было хорошо пока не начал тестировать один из модулей связанных с window.location
каким образом связан? Следить за хешем?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #6 (permalink)  
Старый 25.03.2015, 15:25
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Сообщение от nerv_
каким образом связан? Следить за хешем?
Ну типа того, посмотреть что он правильно оттуда данные получает. При этом методы которые начинают разбирать строку приватны и не хочется их дергать напрямую, хочется тестировать только публичное АПИ.
Ответить с цитированием
  #7 (permalink)  
Старый 25.03.2015, 15:31
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от tsigel
Ну типа того, посмотреть что он правильно оттуда данные получает
подсунь ему строки, кот. может содержать хеш и разбирай их

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

должно работать)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #8 (permalink)  
Старый 28.03.2015, 13:41
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

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

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

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

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книга: JavaScript. Сильные стороны Magneto Учебные материалы 16 21.04.2013 15:28
Интерпретатор Java на JS kobezzza Оффтопик 24 11.10.2012 18:32
Первый Moscow JavaScript Meetup korenyushkin Общие вопросы Javascript 0 26.07.2011 15:23
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34