简体   繁体   English

使用Zend Test设置PHPUnit

[英]Setup PHPUnit with Zend Test

I'm trying to start using PHPUnit with Zend Test for my Zend Framework application. 我正在尝试使用Zend Test和我的Zend Framework应用程序使用PHPUnit。 I'm able to run the PHPUnit command from command line phpunit --configuration phpunit.xml . 我可以从命令行phpunit --configuration phpunit.xml运行PHPUnit命令。 I've tried following this tutorial which is based off of Matthew Weier O'Phinney's blog post . 我已经尝试过本教程该教程基于Matthew Weier O'Phinney的博客文章 I'm getting an error when PHPUnit tries to write the log file. 当PHPUnit尝试写日志文件时,我收到错误。 Here's my phpunit.xml 这是我的phpunit.xml

<phpunit bootstrap="./Bootstrap.php" colors="true">
    <testsuite name="Zend Framework Tests">
        <directory>./</directory>
    </testsuite>
    <!-- Optional filtering and logging settings -->
    <filter>
        <whitelist>
            <directory suffix=".php">../library/</directory>
            <directory suffix=".php">../application/</directory>
            <exclude>
                <directory suffix=".phtml">../application/</directory>
            </exclude>
        </whitelist>
    </filter>
    <logging>
        <log type="coverage-html" target="./log/report" charset="UTF-8" yui="true" highlight="true" lowUpperBound="50" highLowerBound="80"/>
        <log type="testdox-html" target="./log/testdox.html"/>
    </logging>
</phpunit>

My testing bootstrap: 我的测试引导程序:

<?php
//Set app paths and environment
define('BASE_PATH', realpath(dirname(__FILE__) . '/../'));
define('APPLICATION_PATH', BASE_PATH . '/application');
define('TEST_PATH', BASE_PATH . '/tests');
define('APPLICATION_ENV', 'testing');
//Set include path
set_include_path('.' . PATH_SEPARATOR . BASE_PATH . '/library' . PATH_SEPARATOR . get_include_path());
//Set the default timezone
date_default_timezone_set('America/Chicago');
?>

And my ControllerTestCase that I would like my testing controllers to extend: 我的ControllerTestCase,我希望我的测试控制器扩展:

<?php
require_once 'Zend/Application.php';
require_once 'Zend/Test/PHPUnit/ControllerTestCase.php';

abstract class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
    public $_application;

    public function setUp()
    {
        //Override the parent to solve an issue with not finding the correct module
        $this->bootstrap = new Zend_Application(
            APPLICATION_ENV, 
            APPLICATION_PATH . '/configs/application.ini'
        );
        parent::setUp();
    }
}
?>

The error I get when PHPUnit tries to write the log file is: Fatal error: Class 'Symfony\\Component\\Console\\Command\\Command' not found in C:\\repositories\\myfirstzend.com\\includes\\library\\Doctrine\\DBAL\\Tools\\Console\\Command\\ImportCommand.php on line 38 我在PHPUnit尝试写日志文件时得到的错误是: Fatal error: Class 'Symfony\\Component\\Console\\Command\\Command' not found in C:\\repositories\\myfirstzend.com\\includes\\library\\Doctrine\\DBAL\\Tools\\Console\\Command\\ImportCommand.php on line 38

Any clues on what I'm doing wrong? 关于我做错的任何线索? I'm on PHP 5.4, Windows 7, XAMPP 8.0, Pear is up to date, and I have the latest PHPUnit. 我在PHP 5.4,Windows 7,XAMPP 8.0,Pear是最新的,我有最新的PHPUnit。

Update If I change my Bootstrap.php to the following from Matthew Weier O'Phinney's blog: 更新如果我从Matthew Weier O'Phinney的博客中将我的Bootstrap.php更改为以下内容:

<?php
/*
 * Start output buffering
 */
ob_start();

/*
 * Set error reporting to the level to which code must comply.
 */
error_reporting( E_ALL | E_STRICT );

/*
 * Set default timezone
 */
date_default_timezone_set('GMT');

/*
 * Testing environment
 */
define('APPLICATION_ENV', 'testing');

/*
 * Determine the root, library, tests, and models directories
 */
$root        = realpath(dirname(__FILE__) . '/../');
$library     = $root . '/library';
$tests       = $root . '/tests';
$models      = $root . '/application/models';
$controllers = $root . '/application/controllers';

/*
 * Prepend the library/, tests/, and models/ directories to the
 * include_path. This allows the tests to run out of the box.
 */
$path = array(
    $models,
    $library,
    $tests,
    get_include_path()
);
set_include_path(implode(PATH_SEPARATOR, $path));

/**
 * Register autoloader
 */
require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();

/**
 * Store application root in registry
 */
Zend_Registry::set('testRoot', $root);
Zend_Registry::set('testBootstrap', $root . '/application/bootstrap.php');

/*
 * Unset global variables that are no longer needed.
 */
unset($root, $library, $models, $controllers, $tests, $path);

I continue to get the error about Symfony from Doctrine. 我继续从Doctrine得到关于Symfony的错误。 I ensured that I installed pear.symfony.com/Yaml as well. 我确保我也安装了pear.symfony.com/Yaml。 So still broken. 所以仍然破碎。

If I remove the Doctrine reference from my app.ini for the application I'm testing (which means it doesn't get loaded), I still get the error. 如果我从我的app.ini中删除了我正在测试的应用程序的Doctrine引用(这意味着它没有加载),我仍然会收到错误。 It almost feels like the loaders for each of the three parts (PHPUnit, ZF, Doctrine) are fighting each other. 几乎感觉就像这三个部分(PHPUnit,ZF,Doctrine)中的每个部分的加载器都在互相争斗。 Is there a way around this? 有没有解决的办法?

Second update: I downgraded PHPUnit to 3.4.15 and I'm still having this issue. 第二次更新:我将PHPUnit降级到3.4.15,我仍然遇到这个问题。 My next step is to go from PHP 5.4 to 5.3.x. 我的下一步是从PHP 5.4到5.3.x.

Third update: I am now on PHP 5.3.10 and am seeing the same error. 第三次更新:我现在使用PHP 5.3.10并且看到了同样的错误。

If there's more information you need, please let me know. 如果您需要更多信息,请告诉我。

I'm missing the loading of the application in your bootstrap. 我错过了你的bootstrap中的应用程序加载。

require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();

To give you an idea about what I have in my tests/bootstrap.php (this is auto-generated by zend tool since release-1.11.4) 为了让你了解我在我的tests / bootstrap.php中的内容(这是自发行版1.11.4以来由zend工具自动生成的)

<?php

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();

As mentioned by the Zend Framework manual, best is to use PHPUnit 3.4.15 although I could run my tests using PHPUnit 3.6.12 as I'm isolating my tests to focus on my business logic and not the logic of Zend Framework. 正如Zend Framework手册所提到的,最好是使用PHPUnit 3.4.15,尽管我可以使用PHPUnit 3.6.12运行我的测试,因为我正在隔离我的测试以专注于我的业务逻辑而不是Zend Framework的逻辑。

I also modified my phpunit.xml as well into the following: 我还修改了我的phpunit.xml到以下内容:

<phpunit bootstrap="./bootstrap.php" colors="true">
    <testsuite name="Application Test Suite">
        <directory>./application</directory>
    </testsuite>
    <testsuite name="Library Test Suite">
        <directory>./library</directory>
    </testsuite>

    <filter>
        <whitelist>
            <directory suffix=".php">../../library</directory>
            <directory suffix=".php">../../application</directory>
            <exclude>
                <directory suffix=".php">../../library/Zend</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>

I hope this solves many of your issues you're facing now. 我希望这能解决你现在面临的许多问题。

Best regards, 最好的祝福,

Michelangelo 米开朗基罗

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM