2TDD infected

HraKK

Мудак
Команда форума
whirlwind
Ага, совершенно верно. Вчера диаграммы чертил, сегодня все это делаю)

Beavis
Потести. И код в студию, плз. У меня не получилось.
 

Beavis

Banned
HraKK
я делал что объект реагирует на foreach, по идее значит и на next() должен...
просто щас времени нет проверять, если действительно не работает, странно
 

Krishna

Продался Java
сделать implements от класса итератора
implements, если что, делается для интерфейса, а не класса

-~{}~ 28.01.10 11:46:

Кстати никто не знает как заставить класс реагировать на next()?
Какой странный вопрос. Очевидно, реализовать в нём метод next().
 

Beavis

Banned
Автор оригинала: Krishna
implements, если что, делается для интерфейса, а не класса
ты оправдываешь свою подпись ;)
и не "для интерфейса", а "от" интерфейса))


Автор оригинала: Krishna
Какой странный вопрос. Очевидно, реализовать в нём метод next().
т.е. если в классе реализовать метод next(), то при вызове next($object) этот метод будет вызываться?)
 

Жигaн

Новичок
Вообще-то next() reset() и т.п. никогда не работали с объектом как итератором. Если на вход next() подается объект, то перебираются public свойства объекта.
 

HraKK

Мудак
Команда форума
Блин, жешь флудера, я же попросил
Потести. И код в студию, плз. У меня не получилось.
Нет, все набежались обсуждать нюансы слова и что как работает, не проверив, работает ли это вообще.

PHP:
class A implements Iterator
{
	public function next()
	{
		return 2;
	}
	
	public function current()
	{
		
	}
	
	public function key()
	{
		
	}
	
	public function valid()
	{
		
	}
	
	public function rewind()
	{
		
	}
}
$a = new A();
var_dump( next($a) );
выведет false

-~{}~ 28.01.10 18:20:

Еще вопрос как заставить
PHP:
foreach( MockObject as $key => $value )
{

}
пробую как обычно setReturnValueAt - не работает, может я что-то не то делаю?
 

whirlwind

TDD infected, paranoid
Ты бы сказал, что хочешь сделать. Там где итераторы, моки лучше не использовать, потому что там будет частичный мок и мок-итератор. Вот здесь мельком описывается http://prolib.ru/mocks в параграфе Критерий цены.
 

Krishna

Продался Java
HraKK
Ты мануал то почитай. Итерируемый объект должен реализовывать http://www.php.net/manual/en/class.iteratoraggregate.php , а не непосредственно http://www.php.net/manual/en/class.iterator.php

Ну вы даёте :)

-~{}~ 28.01.10 19:41:

Хотя даже и итератор напрямую форыч обрабатывает вроде :)
Там же примеры есть.

-~{}~ 28.01.10 19:44:

Да, я прогнал, уже забыл :)
ИтераторАггригейт необходимо тока када их несколько на итерируемый объект или когда "по хорошему нада"

вот рабочий пример из одного говнопроектика моего :)

PHP:
class View_Collection implements Iterator, Countable 
{
  protected $_arElements = array();

  public function add(View_Data $objView)
  {
   $this->_arElements[] = $objView;
  }
  
  public function rewind() 
  {
    reset($this->_arElements);
  }

  public function current() 
  {
    $mixElement = current($this->_arElements);
    return $mixElement;
  }

  public function key() 
  {
  	$this->
    $mixKey = key($this->_arElements);
    return $mixKey;
  }

  public function next() 
  {
    $mixValue = next($this->_arElements);
    return $mixValue;
  }

  public function valid() 
  {
    $blValue = ($this->current() !== false);
    return $blValue;
  }
  
  public function count()
  {
   return count($this->_arElements);	
  }
 
}
-~{}~ 28.01.10 19:45:

этот класс прекрасно форычится
 

HraKK

Мудак
Команда форума
Krishna
То ли я идиот, то ли что.
foreach меня не волнует, он все прекрасно обрабатывается, я про него ни слова не сказал. Даже уже код написал с результатом и ясным ожидаемым поведением.


whirlwind
У меня есть функция setParam( MyIterator $ObjectParam )
внутри ее форичем разберется об]ект, хочу протестировать этот метод, но для этого надо передать моковый объект, а он у меня форичем что-то не пашет.

-~{}~ 28.01.10 19:19:

Вопрос насчет next снимается, нужно было инплементировать ArrayIterator
 

whirlwind

TDD infected, paranoid
Почитай про моки статью. Если тест трудно формализуется, значит что то не так. Скорее всего, тебе надо другой дубль использовать. Мок задолбаешься настраивать. Вообще, пыховский форыч увеличивает coupling классов. Будешь играть против тестов, получишь ложный гринлайн. Покажи sequence diagram, скажу конкретнее.
 

HraKK

Мудак
Команда форума
А что тут трудного формализуется?
Есть простой метод - установка параметров класса, куда можно передать либо массив с параметрами либо объект(Контейнер) который имплементирует интерфейс Итератор . Вот и все. Хочу протестировать поведение на передачу контейнера, а так как там в методе используется форич -то мок должен сэмулировать поведение.
 

whirlwind

TDD infected, paranoid
Ну я спорить то не собираюсь. Потом не забудь скинуть сколько строк у тебя настройка моков для этого теста заняла.
 

HraKK

Мудак
Команда форума
Не сколько, я не могу понять как настроить мок на форич) Именно это я и спрашиваю)

То есть:
PHP:
$Mock = new MockIterator;
......
тут надо его настроить
......
foreach( $Mock as $a => $b)
{
.....profit!
}
Для меня логично что foreach вызывает функцию next, но мок на нее не отвечает.

PHP:
$Mock ->setReturnValueAt( 0, 'next', array( 'key1' => 1 ) );
$Mock ->setReturnValueAt( 1, 'next', array( 'key2' => 2 ) );
$Mock ->setReturnValueAt( 2, 'next', array( 'key3' => 3 ) );
 

whirlwind

TDD infected, paranoid
Я ж те грю - смотри в статью:
PHP:
 $rs = $this->getMock('ResultSet');
        $rs->expects($this->at(0))
            ->method('next')
            ->will($this->returnValue(true));
        $rs->expects($this->at(1))
            ->method('get')
            ->with($this->equalTo('id'))
            ->will($this->returnValue(123));
        $rs->expects($this->at(2))
            ->method('getRow')
            ->will($this->returnValue(Array('id' => 123,'name' => 'foo')));
        $rs->expects($this->at(3))
            ->method('next')
            ->will($this->returnValue(true));
        $rs->expects($this->at(4))
            ->method('get')
            ->with($this->equalTo('id'))
            ->will($this->returnValue(345));
        $rs->expects($this->at(5))
            ->method('getRow')
            ->will($this->returnValue(Array('id' => 345,'name'=>'bar')));
        $rs->expects($this->at(6))
            ->method('next')
            ->will($this->returnValue(false));
Хоть это и не ArrayIterator, но примерно то же самое. Нравится? Мне нет. По этому, пиши другой дубль. Или убери type hinting из сигнатуры метода и обойдись единичным тестом с массивом. Если нет разницы, зачем писать больше?
 

HraKK

Мудак
Команда форума
Пля, вот что значит не юзать тесты дофига времени. Прекратили поддержку его? Ладно, тогда завтра перепишу на PHPUnit, он не умер хоть?

-~{}~ 28.01.10 20:02:

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

Спасибо!

-~{}~ 29.01.10 15:56:

А есть в PHPUnit что-то типа:
PHP:
$test->run( new HtmlReporter() );
Или как там принято вызывать тесты, если я не хочу их через коммандную строку вызывать, а через браузер?
 

whirlwind

TDD infected, paranoid
я так делаю

phpunit <путь/к/папке или файлу с тестом>

listener и loader там можно заменять, но я не делал, необходимости как-то не возникало.
 
Сверху