Intereting Posts
Как Doctrine 2 извлекает объекты без вызова конструктора объекта? Считывание строк в PHP не работает Объединение баз данных WordPress Как я могу поместить внутренний тег в другое положение? Ошибка командной строки Codeigniter – PHP Неустранимая ошибка: Class 'CI_Controller' не найден Получение сериализации данных в php-файле с использованием ajax Обмен переменными между функциями в PHP без использования глобальных переменных Как построить расширение PHP, которое выполняется во многих версиях PHP? Как отправить строку json обратно в jquery Не отображается PHP MySQL INSERT и не отображается какая-либо ошибка Запустить второй запрос внутри цикла foreach? Масштабирование водяного знака для соответствия родительскому изображению при загрузке имен файлов с неанглийских языков не отображаются в загруженном файле правильно Проверка имени класса / метода с регулярным выражением

Использование файлов YAML в качестве поставщика данных в PHPUnit (CIUnit)

Я пишу приложение, используя PHP CodeIgniter Framework. Я пытаюсь протестировать приложение, используя CI_Unit, с расширением PHPUnit. Чтобы проверить модель, я пытаюсь загрузить поставщика данных YAML, как это определено в документации PHPUnit, я получаю сообщение об ошибке. Если я перепутаю объект поставщика данных, я получаю еще одну ошибку. Если я предоставил ему ванильный PHP-массив, он будет работать, как ожидалось.

Что я делаю не так? Каков правильный способ сделать это? Ниже приведены мои результаты:

Если я PHPUnit_Extensions_Database_DataSet_YamlDataSet объект PHPUnit_Extensions_Database_DataSet_YamlDataSet файла PHPUnit_Extensions_Database_DataSet_YamlDataSet ниже, я получаю:

Набор данных «Клиенты» недействителен.

Если я PHPUnit_Extensions_Database_DataSet_YamlDataSet объект, возвращаемый PHPUnit_Extensions_Database_DataSet_YamlDataSet и возвращаю его: я получаю эту ошибку:

PHPUnit_Framework_Exception: Ни «models.php», ни «models.php» не могут быть открыты. в /Users/eric/pear/share/pear/PHPUnit/Util/Skeleton/Test.php в строке 100

Если я предоставил ему ванильный PHP-массив, тесты будут работать нормально. Команда, которую я использую для запуска тестов:

Модели phpunit

Ниже приведен пример моего файла YAML.

 Clients: 1: client_id: 1 client_information: "info number 1" client_key: 48fb10b15f3d44a09dc82d 2: client_id: 2 client_information: "info number 2" client_key: 48fb10b15f3d44addd 

Я использую PHP 5.3, PHPUnit 3.6.10, DBUnit 1.1.2, CodeIgniter 2.1.0 и CI_unit, связанные с CI 2.1.0.

Изменить: Прикреплено мои модели / файл Test.php:

 /** * test_add_client * @dataProvider add_client_provider */ public function test_add_client($client_id,$company_id,$software_id,$client_information,$client_key) { $data = array('software_id' => $software_id, 'client_information' => $client_information, 'client_key' => $client_key); try { $id = $this->_m->add_client($company_id,$data); $this->assertEquals(true, is_int($id)); } catch (Exception $e){ $this->assertEquals(true,false); } } public function add_client_provider() { $result = new PHPUnit_Extensions_Database_DataSet_YamlDataSet( dirname(__FILE__)."/../fixtures/Clients.yml"); // Case #1 returns this $result //return $result; foreach($result as $key => $value){ if($key == 'Clients'){ $substructure = $value; } } // Case #2 return the inner structure that is the table return $substructure; // Case #3 return an array of arrays $data = array( array(1,1,1,'test','text 2'), array(1,2,1,'test 3', 'test 3')); return $data; } 

Как описано в документации PHPUnit для поставщиков данных :

Метод поставщика данных должен быть public и либо возвращать массив массивов, либо объект, реализующий интерфейс Iterator и выводит массив для каждого шага итерации. Для каждого массива, который является частью коллекции, в качестве аргументов будет вызываться тестовый метод с содержимым массива.

Основываясь на исходном коде Test.php , кажется, вам нужно что-то вроде этого:

  /** * test_add_client * @dataProvider add_client_provider */ public function test_add_client($data) { $company_id = 0; $id = $this->_m->add_client($company_id, $data); $this->assertEquals(true, is_int($id)); } public function add_client_provider() { $result = new PHPUnit_Extensions_Database_DataSet_YamlDataSet( dirname(__FILE__)."/../fixtures/Clients.yml"); // Return the Clients data $clients = array(); $tbl = $result->getTable('Clients'); for ($i = 0; $i < $tbl->getRowCount(); $i++) { $clients[] = $tbl->getRow($i); } return $clients; } 

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

Файл phpunit.xml имеет значения и может быть удален из вашего вопроса, насколько я могу судить.

Вам также не нужен блок try/catch в методе тестирования PHPUnit – PHPUnit позаботится об этом для вас.

Обратите внимание, что ваш $company_id не был определен, поэтому я просто установил его на 0. Ваши аргументы метода и данные YAML выше, похоже, не соответствуют полностью выше, но это должно быть легко исправить.

add_client массив в тестовую функцию, которая немедленно add_client методу add_client , ваш код немного более DRY.