php - 使用 Zend 测试设置 PHPUnit

标签 php zend-framework doctrine phpunit zend-test

我正在尝试开始将 PHPUnit 与 Zend Test 一起用于我的 Zend Framework 应用程序。我能够从命令行 phpunit --configuration phpunit.xml 运行 PHPUnit 命令。我试过关注 this tutorial这是基于 Matthew Weier O'Phinney 的 blog post .当 PHPUnit 尝试写入日志文件时出现错误。这是我的 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>

我的测试 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');
?>

还有我希望测试 Controller 扩展的 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();
    }
}
?>

PHPUnit 尝试写入日志文件时出现的错误是: fatal error :在第 38 行的 C:\repositories\myfirstzend.com\includes\library\Doctrine\DBAL\Tools\Console\Command\ImportCommand.php 中找不到类 'Symfony\Component\Console\Command\Command'

关于我做错了什么的任何线索?我在 PHP 5.4、Windows 7、XAMPP 8.0 上,Pear 是最新的,我有最新的 PHPUnit。

更新 如果我将我的 Bootstrap.php 更改为来自 Matthew Weier O'Phinney 的博客的以下内容:

<?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);

我继续从 Doctrine 得到有关 Symfony 的错误。我确保我也安装了 pear.symfony.com/Yaml。所以还是坏了。

如果我从我的 app.ini 中删除我正在测试的应用程序的 Doctrine 引用(这意味着它没有被加载),我仍然会收到错误。几乎感觉这三个部分(PHPUnit、ZF、Doctrine)中的每一个的加载程序都在互相争斗。有解决办法吗?

第二次更新:我将 PHPUnit 降级到 3.4.15,但我仍然遇到这个问题。我的下一步是从 PHP 5.4 升级到 5.3.x。

第三次更新:我现在使用的是 PHP 5.3.10,但看到了同样的错误。

如果您需要更多信息,请告诉我。

最佳答案

我没有在您的 Bootstrap 中加载应用程序。

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

让您了解我的 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();

如 Zend Framework 手册所述,最好是使用 PHPUnit 3.4.15,尽管我可以使用 PHPUnit 3.6.12 运行我的测试,因为我正在隔离我的测试以专注于我的业务逻辑而不是 Zend Framework 的逻辑.

我还将我的 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>

我希望这能解决您现在面临的许多问题。

最好的问候,

米开朗基罗

关于php - 使用 Zend 测试设置 PHPUnit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12041979/

相关文章:

php - SQL 语法错误 ZF1

zend-framework - 我如何设置cron作业是zend框架项目的一部分的脚本

symfony - 如何使用 Doctrine ArrayCollection 的 forAll 方法?

php - 使用工厂单元测试 Zend Framework 2 模块

php - apache + Varnish + nginx + ssl + wordpress将所有http流量重定向到https

javascript - 将单选按钮值传递到数组中的另一个 PHP 页面

php - 聪明人VS。 Javascript/AJAX

php - 使用 Zend Framework 时,您将验证逻辑放在哪里?

php - 使用 PHP 数组中的 optgroup 生成下拉菜单

php - Doctrine\Common\Persistence\Mapping\Driver 丢失