2TDD infected

HraKK

Мудак
Команда форума
И кстати, мне до сих пор не удалось заставить класс реагировать на вызов функции
PHP:
 next( $object );
 

HraKK

Мудак
Команда форума
я так делаю

phpunit <путь/к/папке или файлу с тестом>
ну это коммандная строка, а я же говорю что хочу через браузер, мне так удобнее.


Не мок, простой объект не могу сделать чтоб он реагировал) Похоже в пхп с этим не доделали и это нереально.

-~{}~ 29.01.10 16:17:

Пля, это круто развивающийся PHPUnit в котором нету html reports?))
 

whirlwind

TDD infected, paranoid
Блин. Ну ты покажи тот мок который не реагирует. Я тебе скажу почему :) На форыч моки реагируют, щас поищу у себя. Но ты все равно показывай ;)

-~{}~ 29.01.10 17:20:

все там есть. тебе не репорт нужен а раннер. доку открой
 

HraKK

Мудак
Команда форума
Еще один, да на форич все реагирует прекрасно. А вот на вызов функции
next( $obj ) не срабатывает.

-~{}~ 29.01.10 16:37:

все там есть. тебе не репорт нужен а раннер. доку открой
Как это есть? Если я обшерстил инет и там ясно сказано что нету вебрепорта. То есть как, можно запустить с командной строки, оно генерирует отчет и его можно посмотреть в браузере. НО! я не хочу делать 2 действия, если можно одно - обновить окно в браузере, улавливаешь?
 

whirlwind

TDD infected, paranoid
HraKK ну тут я спорить не собираюсь. я же тебе его не продаю. хочешь есть кактусы в симплтестом ради лени написать exec(phpunit blablabla) - твое право.

Насчет мока на итератор. Итератор - сложный объект. Последний раз говорю, мок на него делать невыгодно. Более подробно по поводу моков я описал в своей статье. Если там что то не понятно, можешь написать здесь - я поправлю.

PHP:
<?php

require_once 'PHPUnit/Framework.php';

class MyIterator implements Iterator
{
    private $var = array();

    public function __construct($array)
    {
        if (is_array($array)) {
            $this->var = $array;
        }
    }

    public function rewind() {
        echo "rewinding\n";
        reset($this->var);
    }

    public function current() {
        $var = current($this->var);
        echo "current: $var\n";
        return $var;
    }

    public function key() {
        $var = key($this->var);
        echo "key: $var\n";
        return $var;
    }

    public function next() {
        $var = next($this->var);
        echo "next: $var\n";
        return $var;
    }

    public function valid() {
        //$var = $this->current() !== false;
        $var = (current($this->var) !== false);
        echo "valid: {$var}\n";
        return $var;
    }
}


class FooTest extends PHPUnit_Framework_TestCase {

    function testFoo()
    {
    	$a = array(1,2);
    	$i = new MyIterator($a);
    	foreach ( $i as $k => $v ) {
    		echo "$k => $v\n";
    	}
    	
    	$mi = $this->getMock('Iterator');
    	$mi->expects($this->at(0))
    		->method('rewind');
    	$mi->expects($this->at(1))
    		->method('valid')
    		->will($this->returnValue(1));
    	$mi->expects($this->at(2))
    		->method('current')
    		->will($this->returnValue(1));
    	$mi->expects($this->at(3))
    		->method('key')
    		->will($this->returnValue(0));
    		
    	$mi->expects($this->at(4))
    		->method('next')
    		->will($this->returnValue(2));
    	$mi->expects($this->at(5))
    		->method('valid')
    		->will($this->returnValue(1));
    	$mi->expects($this->at(6))
    		->method('current')
    		->will($this->returnValue(2));
    	$mi->expects($this->at(7))
    		->method('key')
    		->will($this->returnValue(1));
    		
    	$mi->expects($this->at(8))
    		->method('next')
    		->will($this->returnValue(false));
    	$mi->expects($this->at(9))
    		->method('valid')
    		->will($this->returnValue(false));

    	echo "mock working...\n";
    	foreach ( $mi as $k => $v ) {
    		echo "$k => $v\n";
    	}
    	
    }

}
-~{}~ 29.01.10 17:44:

если ты имеешь в виду функцию [m]next[/m] то у меня в голове не укладывается - как при оо можно сетовать на то, что де функция не член класса дает какой-то не такой результат. Максимум чем могу помочь - все претензии к функции.
 

HraKK

Мудак
Команда форума
Да йомайо. Ту проблему с итератором мы решили))))

Не мок, простой объект не могу сделать чтоб он реагировал)
Простой напиши класс. Класс. Да, не мок. Именно класс. Да, да ты правильно прочитал - класс. Который реагирует на next(). Next(). Нет, не foreach. Да, точно-точно не foreach. Что? Да нет даже и не for. Уверен. Да, точно не foreach и не for. Уверен. Да именно всего лишь на next( $obj). Абсолютно. Да. Ну нет же не foreach. Да, да все правильно next(). Спасибо.

-~{}~ 29.01.10 16:47:

если ты имеешь в виду функцию next то у меня в голове не укладывается - как при оо можно сетовать на то, что де функция не член класса дает какой-то не такой результат. Максимум чем могу помочь - все претензии к функции.
А как реагирует на isset, на count ?:)
 

whirlwind

TDD infected, paranoid
HraKK сам-то документацию на next открывал? ;) внутренний указатель _чего_ он увеличивает? объекта? а array - это не объект.

-~{}~ 29.01.10 17:50:

HraKK PS. Я не верю что это ты задаешь такие вопросы :) отсюда и долго не догонял что за next.
 

HraKK

Мудак
Команда форума
whirlwind
да мне чисто академически интересно.

Да ничего оно не должно увеличивать, это должны быть заботы класса что он там увеличивает. Класс наследуя интерфейс Iterator должен как по мне вызывать callback на next()
 

whirlwind

TDD infected, paranoid
дык откуда он узнает что ты next на экземпляр сделал? телепатически? :D все претензии к функции :)
 

HraKK

Мудак
Команда форума
Отлично есть --coverage-html.... Но только при xDebug, где я это возьму на винде?

-~{}~ 29.01.10 17:03:

дык откуда он узнает что ты next на экземпляр сделал? телепатически? все претензии к функции
а count( $obj ) откуда узнает?) Должен хук срабатывать)
 

whirlwind

TDD infected, paranoid
зачем тебе coverage? это покрытие кода тестами. exec + phpunit --story-html t.html tTest
а если хочется красот, то http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=cool+phpunit

-~{}~ 29.01.10 18:07:

Автор оригинала: HraKK
а count( $obj ) откуда узнает?) Должен хук срабатывать)
count и форыч на объект срабатывает потому что там типа get_object_vars идет. никакие там не хуки. с хуками к тони :)
 

HraKK

Мудак
Команда форума
Ладно, с раннером разобрался, теперь гадаю чего мое ZDE не подсвечивает $this->asse...

-~{}~ 29.01.10 17:18:

на форыч не правда, там срабатывает
rewind()
valid()
current()
key()
next()
и так дальше

на count срабатывает
count()

что мешает на next сработать next()? Уже реализованный для foreachа?
 

HraKK

Мудак
Команда форума
Как можно подружить PHPUnit с Code completion?

-~{}~ 29.01.10 17:29:

whirlwind
А я о чем) Как по мне - недоделка)

-~{}~ 29.01.10 17:37:

Ага, залез в код PHPUnit разобрался, теперь инетерсно почему в документации указанно что надо $this->assert... хотя на самом деле правильно self::assert?

-~{}~ 29.01.10 18:31:

Или я не прав? В Зенде тоже $this-> хотя ясно в исходном видим:
PHP:
public static function assert
-~{}~ 29.01.10 19:24:

так кто же прав?)

-~{}~ 29.01.10 19:27:

Вывод кстати идет на экран такой:
Код:
Tests: 4, Assertions: 4, Failures: 1.
А по подробнее нельзя?
 

whirlwind

TDD infected, paranoid
Насчет статиков, лично я не разделяю стремление Себастьяна копировать junit один-в-один, но этот вопрос конечно спорный. Дело в том, что junit ассерты статические и в последнем phpunit функционал junit4 то-же статически перенесен. Разница в том, что в яве синтаксис статического вызова не отличается от нестатического, а в пыхе отличается. Мне не нравится изменять стиль, но в общем-то, это дело привычки.

По поводу вывода уточни. У меня вывод такой
Код:
PHPUnit 3.4.5 by Sebastian Bergmann.

....I.......................................................   60 / 1759
skipped
............................................................ 1740 / 1759
...................

Time: 30 seconds, Memory: 98.00Mb

OK, but incomplete or skipped tests!
Tests: 1759, Assertions: 16590, Incomplete: 1.
но это в консоли. Со всякими вебмордами я тебе не подскажу ибо не использую. Для детализации стандартного вывода есть опция --verbose, но это тоже про консоль.
 

HraKK

Мудак
Команда форума
дык я же консолью, и просто вывожу в веббасе результат - так быстрее тестировать

но в общем-то, это дело привычки.
У меня ZDE отказывает подсвечивать сомплит при $this-> а при self отлично работает, что в общем-то и логично, так что это как по мне логичней использовать.

есть опция --verbose
спасибо, попробую!

-~{}~ 30.01.10 02:30:

Ага, написал свой html класс корорый детализирует в html, все вроде ок!)

-~{}~ 31.01.10 01:54:

Переписал все тесты с симпла на Unit, пока вроде все норм и нравиться, кастомизировал немного HTML_Reporter, завтра-после завтра ждите очередную пачку нубских вопросов ;)

З.Ы. как будто блог виду)

-~{}~ 31.01.10 21:19:

Вот, проблема есть метод возвращающий такой экземпляр класса:
(упрощенно)
PHP:
class Collection
{
     public function __construct( $array )
     {
              foreach( $array as $key => $value )
                      $this->$key = $value
      }     
}

MyMethod()
{
      return new Collection( array('key'=>'fsdfsdf','key2'=>'fdsfsdfc'));
}
Как проверить что данные в нем такие как надо?
делать проверки 2 проверки на каждый ключ?
PHP:
$Collection = MyMethod();
self::assertSame( $Collection->key = 'fsdfsdf';
self::assertSame( $Collection->key2 = 'fdsfsdfc';
Или есть умнее путь? Например создать мок и как-то ему назначить проперти?
Например так:
PHP:
$MockCollection = $this->getMock('Collection');
$MockCollection->key = 'fsdfsdf';
$MockCollection->key2 = 'fdsfsdfc';
self::assertSame( $Collection, $MockCollection );
 

whirlwind

TDD infected, paranoid
Как ты представляешь мок на атрибут? Атрибуты не обладают полиморфностью. Используй первый вариант. Не стесняйся выделять фикстуры и сокращать тесты за счет добавления новых комплексных ассертов.
 

whirlwind

TDD infected, paranoid
Из-за динамической типизации в пыхе, злоупотребление моками чревато проблемами при рефакторинге. Не думаю, что ты будешь рад обнаружить, что тесты ничего не тестируют, так что не советую увлекаться.
 
Сверху