2013-02-10 2 views
1

Прежде всего, я очень новичок в Zend Framework. На самом деле всего около 1 дня. Я также абсолютно нелюден с PHPUnit. Я не думаю, что использование Zend Framework практично без Unit Testing, и мне нужно понять, как это сделать за короткое время. Я был бы обязан, если бы вы могли помочь мне в этом. Это то, что я сделал.Zend Framework 2 - PHPUnit - Тестирование модулей - не выполнено никаких тестов плюс идеи

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

Я также установил Composer.

Вот что я сделал, я установил PHPUnit после установки PEAR. Теперь, когда я положил phpunit, где он дает список опций. Поэтому я предполагаю, что это хорошо.

Я получил Zend Skeleton Application от GitHub. Получил Zend Framework по Composer.

Я просмотрел документацию. Я чувствую, что моя голова дует! Мой вопрос связан с модульным тестированием в частности. Проблема заключается в содержании по адресу http://framework.zend.com/manual/2.1/en/user-guide/unit-testing.html.

<?xml version="1.0" encoding="UTF-8"?> 
<phpunit bootstrap="Bootstrap.php"> 
    <testsuites> 
     <testsuite name="zf2tutorial"> 
      <directory>./ApplicationTest</directory> 
     </testsuite> 
    </testsuites> 
</phpunit> 

Этот файл, который находится в zf2-tutorial/module/Application/test. Мой вопрос, не является ли Bootstrap.php файлом, который находится в zf2-tutorial/module/Application/test?

В документации говорится о создании Bootstrap.php, но в {Application Folder}/test. При этом, когда я запускаю phpunit в zf2-tutorial/module/Application/test, он говорит, что файл zf2-tutorial/module/Application/test/Bootstrap.php не может быть открыт.

Затем я изменил Bootstrap.php в XML на /../../../test/Bootstrap.php (как рекомендовал документ, который будет создан по XML-файлу), который разрешил ошибку. Но граф тест равен нулю: No tests executed!

Вот тест:

<?php 
namespace ApplicationTest\Controller; 

use Zend\Test\PHPUnit\Controller\AbstractHttpControllerTestCase; 
//use PHPUnit_Framework_TestCase; 
//I also tried PHPUnit_Framework_TestCase instead of AbstractHttpControllerTestCase 
class IndexControllerTest extends AbstractHttpControllerTestCase 
{ 
    public function setUp() 
    { 
     $this->setApplicationConfig(
      //include '/path/to/application/config/test/application.config.php' 
      include __DIR__ . '/../../../../config/application.config.php' 
     ); 

     parent::setUp(); 
    } 
    /** 
    * @test 
    */ 
    public function testIndexActionCanBeAccessed(){ 
     $this->dispatch('/'); 
     $this->assertResponseStatusCode(200); 
     $this->assertModule('application'); 
     $this->assertControllerName('application_index'); 
     $this->assertControllerClass('IndexController'); 
     $this->assertMatchedRouteName('home'); 
    } 
} 

include '/path/to/application/config/test/application.config.php' ??? Этот модный путь, который я переименовал в include __DIR__ . '/../../../../config/application.config.php'.

Файл находится в тестовой папке zf-tutorial/module/Application/test/ApplicationTest/Controller.

В конце любой вещи, No tests executed! - это все, что должен сказать блок PHP.

Что я сделал не так? Что я могу сделать, чтобы все исправить.

Я также хотел бы иметь краш-курс по теме (ссылка на блог или что-то в этом роде), я понимаю, что даже у Amazon нет книги для ZF2. Я был бы рад, если бы вы могли дать мне руку. Это действительно актуально!

Спасибо заранее!

Дополнения :: Я пропустил создание Bootstrap.php в тестовой папке.

Новый XML подобен этому

<?xml version="1.0" encoding="UTF-8"?> 
<phpunit bootstrap="Bootstrap.php"> 
    <testsuites> 
     <testsuite name="zf2tutorial"> 
      <directory>./ApplicationTest</directory> 
     </testsuite> 
    </testsuites> 
</phpunit> 

Bootstrap.php выглядит как этот

<?php 

chdir(dirname(__DIR__)); 
include __DIR__ . '/../../../init_autoloader.php'; 

init_autoloader.php был модифицирован, чтобы найти библиотеку ZendFramework.

Но еще PHPUnit говорит No tests executed!

+0

У меня есть такая же проблема. С версией PHPUnit на моем Mac тесты выполняются. С версией в Linux я получил ошибку выше. Кажется, действительно неясно, в чем разница и почему одна ОС запускает ее, а другая - нет. –

ответ

3

Изменение phpunit.xml

<?xml version="1.0" encoding="UTF-8"?> 
<phpunit bootstrap="Bootstrap.php"> 
    <testsuites> 
     <testsuite name="zf2tutorial"> 
      <directory>./</directory> 
     </testsuite> 
    </testsuites> 
</phpunit> 
0

Используйте Bootstrap.php написанный Эваном Coury предоставляется на User Guide:

<?php 
namespace HelloworldTest; //Change this namespace for your test 

use Zend\Loader\AutoloaderFactory; 
use Zend\Mvc\Service\ServiceManagerConfig; 
use Zend\ServiceManager\ServiceManager; 
use Zend\Stdlib\ArrayUtils; 
use RuntimeException; 

error_reporting(E_ALL | E_STRICT); 
chdir(__DIR__); 

class Bootstrap 
{ 
    protected static $serviceManager; 
    protected static $config; 
    protected static $bootstrap; 

    public static function init() 
    { 
     // Load the user-defined test configuration file, if it exists; otherwise, load 
     if (is_readable(__DIR__ . '/TestConfig.php')) { 
      $testConfig = include __DIR__ . '/TestConfig.php'; 
     } else { 
      $testConfig = include __DIR__ . '/TestConfig.php.dist'; 
     } 

     $zf2ModulePaths = array(); 

     if (isset($testConfig['module_listener_options']['module_paths'])) { 
      $modulePaths = $testConfig['module_listener_options']['module_paths']; 
      foreach ($modulePaths as $modulePath) { 
       if (($path = static::findParentPath($modulePath))) { 
        $zf2ModulePaths[] = $path; 
       } 
      } 
     } 

     $zf2ModulePaths = implode(PATH_SEPARATOR, $zf2ModulePaths) . PATH_SEPARATOR; 
     $zf2ModulePaths .= getenv('ZF2_MODULES_TEST_PATHS') ?: (defined('ZF2_MODULES_TEST_PATHS') ? ZF2_MODULES_TEST_PATHS : ''); 

     static::initAutoloader(); 

     // use ModuleManager to load this module and it's dependencies 
     $baseConfig = array(
      'module_listener_options' => array(
       'module_paths' => explode(PATH_SEPARATOR, $zf2ModulePaths), 
      ), 
     ); 

     $config = ArrayUtils::merge($baseConfig, $testConfig); 

     $serviceManager = new ServiceManager(new ServiceManagerConfig()); 
     $serviceManager->setService('ApplicationConfig', $config); 
     $serviceManager->get('ModuleManager')->loadModules(); 

     static::$serviceManager = $serviceManager; 
     static::$config = $config; 
    } 

    public static function getServiceManager() 
    { 
     return static::$serviceManager; 
    } 

    public static function getConfig() 
    { 
     return static::$config; 
    } 

    protected static function initAutoloader() 
    { 
     $vendorPath = static::findParentPath('vendor'); 

     if (is_readable($vendorPath . '/autoload.php')) { 
      $loader = include $vendorPath . '/autoload.php'; 
     } else { 
      $zf2Path = getenv('ZF2_PATH') ?: (defined('ZF2_PATH') ? ZF2_PATH : (is_dir($vendorPath . '/ZF2/library') ? $vendorPath . '/ZF2/library' : false)); 

      if (!$zf2Path) { 
       throw new RuntimeException('Unable to load ZF2. Run `php composer.phar install` or define a ZF2_PATH environment variable.'); 
      } 

      include $zf2Path . '/Zend/Loader/AutoloaderFactory.php'; 

     } 

     AutoloaderFactory::factory(array(
      'Zend\Loader\StandardAutoloader' => array(
       'autoregister_zf' => true, 
       'namespaces' => array(
        __NAMESPACE__ => __DIR__ . '/' . __NAMESPACE__, 
       ), 
      ), 
     )); 
    } 

    protected static function findParentPath($path) 
    { 
     $dir = __DIR__; 
     $previousDir = '.'; 
     while (!is_dir($dir . '/' . $path)) { 
      $dir = dirname($dir); 
      if ($previousDir === $dir) return false; 
      $previousDir = $dir; 
     } 
     return $dir . '/' . $path; 
    } 
} 

Bootstrap::init(); 

Помните, что пространство имен определено на Bootstrap.php должны быть предоставлены на phpunit.xml.dist:

<?xml version="1.0" encoding="UTF-8"?> 

<phpunit bootstrap="Bootstrap.php"> 
    <testsuites> 
     <testsuite name="zf2tutorial"> 
     <directory>./HelloworldTest</directory> 
     </testsuite> 
    </testsuites> 
</phpunit>