Как я могу остановить Zend_Db_Table_Abstract fetchrow, возвращающего данные мусора при запуске тестов?

Я новичок в Zend и испытываю некоторые трудности с созданием модульных тестов. Я сократил его до минимального тестового класса, который все еще воспроизводит проблему в надежде, что я делаю что-то глупое:

class UserRegistrationsTest extends PHPUnit_Framework_TestCase 
{ 

защищенный $ db;

публичная функция __construct ($ name = NULL) {parent :: __ construct ($ name);

$ this-> db = Zend_Db :: factory ('Pdo_Mysql', array ('host' => '127.0.0.1', 'username' => 'root', 'password' => 'xxxxxxxx', 'dbname' = > 'testingdb'));

Zend_Db_Table_Abstract :: setDefaultAdapter ($ this-> db); }

общедоступная функция testName () {$ users = new Users (); $ select = $ users-> select () -> где ('regCode =?', 'deadbeef'); $ row = $ users-> fetchRow ($ select); }

}

Итак, это упрощенный тест. У меня есть настроенная база данных (которая правильно подключается), в которой есть данные. Есть запись с regCode, установленным на 'deadbeef', а также поля для электронной почты, regDate и affiliate:

CREATE TABLE  testingdb.users (
         regCode varchar(16) NOT NULL,
         email varchar(150) NOT NULL,
         regDate datetime NOT NULL,
         affiliate int(10) unsigned DEFAULT NULL,
         PRIMARY KEY (regCode))   

У меня есть класс под названием Users.php, который настолько прост, насколько это возможно:

class Users extends Zend_Db_Table_Abstract {

protected $_name = 'users';

}

Моя проблема в том, что я могу вставить в базу данных нормально, но любые запросы возвращают нечетные результаты. Приведенный выше fetchRow генерирует правильный SQL, но возвращенная строка является мусором - он возвращает строку, содержащую regCode, адрес электронной почты, без столбца regDate вообще, тогда партнер присутствует, но столбец называется «пользователи», а не «партнер».

Я пробовал это с другими таблицами, и ни одна из них не работает - некоторые даже возвращают имя базы данных в виде заголовка столбца, а также имя таблицы в качестве столбца.

Следует отметить, что если я не использую это в тесте, все работает нормально. Тот же самый код и db в правильном приложении работают отлично, но работают как phpUnit Test, и все становится ужасно :-(

Любые советы приветствуются

Ура, Брин


person davbryn    schedule 29.10.2009    source источник


Ответы (2)


У вас есть какая-либо другая таблица или даже другая база данных с таблицей, в которой есть поле regCode? Вы могли использовать неправильный адаптер, что объясняет, почему ваш запрос все еще выполняется. Предварительным условием для вашей тестовой среды будет, по крайней мере, такая же структура, что и ваша производственная среда (таблицы + поля). Если они различаются, одни запросы могут выполняться хорошо, другие - нет.

person Percutio    schedule 29.10.2009
comment
Вот что странно - в тесте я позаботился о том, чтобы адаптер был специально установлен в конструкторе, чтобы убедиться, что он правильный. Если я поставлю точку останова на fetchRow и перейду через нее, она получит правильную информацию; просто не весь ряд. Название столбца по-прежнему ошибочно. Я возвращаю Zend_Db_Table_Row в настоящее время (пока исправляю его), и в окне переменных $ row :: _ data перечисляет неверную информацию, но $ row :: _ table :: _ cols имеет правильные имена столбцов. Адаптер db тоже правильный. - person davbryn; 29.10.2009

Это была старая ошибка Zend, которая сейчас исправлена.

person davbryn    schedule 07.05.2010