TDD uploading

_vampiro_

Новичок
TDD uploading

Парни, как тестить? :)
формировать пост-запрос чтоль себе? :)

-~{}~ 10.06.06 23:23:

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

whirlwind

TDD infected, paranoid
А зачем пост-запрос? Есть сомнения что при подаче файла нужные данные окажутся в $_FILES? И прежде чем такой вопрос задавать не плохо было бы кратенько описать алгоритм. Навскидку могу назвать кучу вариантов, при которых тесты надо писать по разному. Например

PHP:
new UploadedFile($rawpostdata,$myfileid)
new UploadedFile($myfileid)
new UploadedFile($_FILES[$myfileid])
etc...
 

_vampiro_

Новичок
PHP:
$gallery->uploadFile($fieldname='image');
метод.. просто метод.... тест "падает" на условии

if (move_uploaded_file(...)

:(
 

StUV

Rotaredom
_vampiro_
1. выкладываешь рядом с тестами что-нить вроде
tmp/upload_success.ext
ставишь для него права, которые сервер устанавливает при аплоаде

2. формируешь массив $_FILES для случаев успешного и failed аплоадов (в соотвеотствии со свойствами указанного файла)

3. пишешь тесты для каждого случая

--
ессно - будет лучше, если соответствующие проверки на содержимое $_FILES будут в самом тестируемом классе

-~{}~ 13.06.06 17:39:

зы: можно создать дочерний от Your_Uploader класс, переопределив в нем метод отвечающий за аплоад, и тестить его
 

zerkms

TDD infected
Команда форума
а не является ли обсуждаемая тема предметом функционального тестирования?
 

_vampiro_

Новичок
хм. интересная мысль. сделать класс "moverOfUploads" с единственным методом "move_uploaded_file(..)". В нем вызов одной функции. И в тестах прицепить вместо него мок. Но это как-то.... хм... Слишком уж )

-~{}~ 13.06.06 17:53:

zerkms
я не могу протестить действия, которые происходят при успешной заливке: ресайз, запись в БД и проч. Это u-test, вроде....
 

_vampiro_

Новичок
zerkms
а что делать? :) Плодить приватные методы? а при аплоаде вызывать 4-5 методов подряд?
 

zerkms

TDD infected
Команда форума
моё предложение:

класс upoloader занимается исключительно перемещением файла, путь к которому указан в $_FILES (и естественно задаётся в фикстурах перед тестированием)
соответственно сам постзапрос делать не нужно

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

_vampiro_

Новичок
Я не делаю классы по действиям. По сущностям стараюсь. :)
То есть для фотоархива я делаю объект "картинка" и в нем методы - заливка, удаление, рейтинг, комменты... и т.д.

то есть если от юзара приходит запрос "удалить картинку №23, я далаю так
$image = new Image;
$image ->getFromBase(23);
$image ->Kill();

вот при такой организации, никак не могу заливку припаять. :(

-~{}~ 13.06.06 18:10:

точнее-не мог. Щас буду ёжика рожать.
 

zerkms

TDD infected
Команда форума
что мешает сущности "картинка" и методу "получить из базы" или "залить из пост запроса" делегировать соответствующие действия узкоспециализированным и уже оттестированным классам?
 

_vampiro_

Новичок
"Письмо из центра до Штирлица не дошло" (с)

-~{}~ 13.06.06 18:19:

...перечитываю....

-~{}~ 13.06.06 18:28:

Может чего не так понял, но отвечу "ас из".

У меня и так в методах вызываются уже готовые классы почти везде. То есть, например
PHP:
function Kill(){
  if (user::Instance()->hasRights('kill') ){
  return DB::Instance()->delete(Config::GetTable('photos'),"ID='".$this->ID."'");   
}else
  return false;
}
что-то типа того. Соответственно, пока не выполнится условие (в данном случае - наличие права удалять) - нельзя будет оттестить сам факт удаления. В аплоадере вместо объекта в условии стоит функция ПХП... с ней-то и были проблемы.
 
Сверху