PHPUnit testing

Ярослав

Новичок
PHPUnit testing

Посмотрел сорцы тестинга для Zend Framework
там следующее

PHP:
/**
     * Ensure that exceptions are caught
     *
     */
    public function testCatchExceptionNoIdentity()
    {
        try {
            $result = $this->_adapter->authenticate();
            $this->fail('Exception should have been thrown');
        } catch (Zend_Auth_Exception $e) {
            $this->assertEquals($e->getMessage(), 
                'A value for the identity was not provided prior to authentication with Zend_Auth_Adapter_DbTable.');
        }
    }
Но если кто нибудь изменит сообщение ошибки то тест провалится
Не лучше в данном случае использовать коды ошибок?

Должна быть отдельная база, табла для тестинга уже готовая или создавать в тесте?
Вот как тут делают зендовцы:
PHP:
/**
     * Set up test configuration
     *
     * @return void
     */
    public function setUp()
    {
        $this->_db = new Zend_Db_Adapter_Pdo_Sqlite(
            array('dbname' => TESTS_ZEND_AUTH_ADAPTER_DBTABLE_PDO_SQLITE_DATABASE)
            );

        $sqlCreate = 'CREATE TABLE [users] ( '
                   . '[id] INTEGER  NOT NULL PRIMARY KEY, '
                   . '[username] VARCHAR(50) NOT NULL, '
                   . '[password] VARCHAR(32) NULL, '
                   . '[real_name] VARCHAR(150) NULL)';
        $this->_db->query($sqlCreate);

        $sqlInsert = 'INSERT INTO users (username, password, real_name) '
                   . 'VALUES ("my_username", "my_password", "My Real Name")';
        $this->_db->query($sqlInsert);

        $this->_adapter = new Zend_Auth_Adapter_DbTable($this->_db, 'users', 'username', 'password');
    }
На сколько это корректно?
Ссылаюсь на код зенда, т.к. считаю его одним из лучших php фреймворков.
 

kvf77

Red Devil
Сообщения об ошибках как правило не меняются или крайне редко, тест подправить не проблема, а коды ошибок - это сущий гемор. Ошибка должна быть четкой и понятной.
 

crocodile2u

http://vbolshov.org.ru
kvf77, Ярослав
И все же, имхо, проверять сообщение об ошибке в тестовом методе - это может быть (подчеркну - _может_быть_) не совсем корректно. Более корректный подход - выбрасывать специально выделенный для случая класс исключения. Однако, зенд-фреймворк и так порядочно захламлен тучей классов - так что, как говорится, it depends.

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

whirlwind

TDD infected, paranoid
Меня тоже волнует почему в PHPUnit нет встроенной проверки на масягу эксепшена. Чуствую что не спроста. А с другой стороны плодить эксепшены на каждую ситуацию тоже как то не хорошо.

Я столкнулся с некоторыми проблемами при тестировании эксепшенов. Допустим есть вполне себе конкретный набор классов Request. Есть CommonRequest, который определяет базовую структуру запроса и выбрасывает некоторые исключения. Конкретные запросы от него наследуются и тоже выбрасывают исключения того же класса (вроде смысла делать новый класс исключения нет?). Бывает иногда ошибешься с фикстурой в тесте конкретного запроса и получаешь исключение от базового класса там, где должно быть исключение тестируемого. Это если делать удобное @expectedException без проверки сообщения. Получаем ложное срабатывание теста.

Кто как в подобных ситуациях поступает?

-~{}~ 07.04.08 11:31:

up
 

korchasa

LIMB infected
Автор оригинала: whirlwind
...
Кто как в подобных ситуациях поступает?
Я бы написал свой метод exceptExceptionFrom($class_name) или поменял бы стандартный. В общем, ИМХО, если надо получить exception от определенного класса, то нет смысла пытаться сделать это окольными путями (через сообщение). А кто бросает исключение можно узнать из трейса.
 
Сверху