gpt4 book ai didi

unit-testing - 在 Zend 框架 1 应用程序中,PHPUnit 无法在 Controller 中加载 application.ini,但在模型中工作

转载 作者:行者123 更新时间:2023-12-05 00:30:50 24 4
gpt4 key购买 nike

我们正在使用 Zend 框架 1.11.11。我们的服务器有 PHPUnit 3.7.9。我们知道我们的 Zend Framework 版本不支持 PHPUnit 3.7.9。但到目前为止,我们已经能够使用 PHPUnit 来测试模型。

但是,在测试 Controller 时,PHPUnit 失败了。放置后dispatch()代码在 try/catch block ,我们了解到它无法从 Zend_Registry 加载一个属性。 .定义为 application.ini .模型中使用了相同的属性,我们在那里没有问题。

有没有可能我们遗漏了什么?或者我们的 ZF 版本无法使用 PHPUnit 3.7.9?

这是 phpunit.xml:

<phpunit bootstrap="./application/bootstrap.php" colors="true">
<testsuite name="Precision Tests">
<directory>./</directory>
</testsuite>

<filter>
<whitelist>
<directory suffix=".php">../application/</directory>
<directory suffix=".php">../library/</directory>
<exclude>
<directory suffix=".phtml">../application/</directory>
<directory>../library/Zend</directory>
<file>../application/Bootstrap.php</file>
<file>../application/controllers/ErrorController.php</file>
</exclude>
</whitelist>
</filter>
<logging>
<log type="coverage-html" target="./log/report" charset="UTF-8" yui="true" hightlight="true"
lowupperbound="50" highlowerbound="80">
<log type="testdox" target="./log/testdox.html">
</log>
</log>
</logging>
</phpunit>

测试中的 bootstrap.php:
<?php

function load($name) {
$paths = array(
"../application/controllers",
"../library",
"../application/models"
);
foreach($paths as $dir) {
$name = str_replace("_", "/", $name);
if(file_exists($dir."/".$name.".php")) {
require_once($dir."/".$name.".php");
break;
}
}
}

error_reporting(E_ALL | E_STRICT);

// 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') : 'development'));
$_SERVER["APPLICATION_ENV"] = getenv('APPLICATION_ENV');
$_SERVER["APPLICATION_ENV"] = 'development';

set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/../library'),
realpath(APPLICATION_PATH . '/controllers'),
get_include_path(),
)));

require_once 'Zend/Application.php';
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);

//setting up env variables:
$_SERVER["REMOTE_ADDR"] = '0.0.0.0';
$_SERVER['SERVER_NAME'] ='PHP.UNIT.TEST';
$_SERVER['REQUEST_URI'] = 'PHPUNITTEST';
$_SERVER['QUERY_STRING'] = 'PHPUNITTEST';

require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->registerNamespace('VP');
$autoloader->pushAutoloader("load");
spl_autoload_register();

require_once 'ControllerTestCase.php';

那么这里是 ControllerTestCase.php .我们的模型也扩展了相同的 ControllerTestCase :
<?php

require_once 'Zend/Test/PHPUnit/ControllerTestCase.php';

class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
/**
* @var Zend_Application
*/
protected $application;

public function setUp() {
$this->bootstrap = array($this, 'appBootstrap');
parent::setUp();
}

public function appBootstrap() {
$this->application = new Zend_Application(APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini');
$this->application->bootstrap();
}
}

这是一个不从 application.ini 加载属性的示例 Controller :
<?php

class MyControllerTest extends ControllerTestCase
{
public function setUp()
{
$this->getFrontController()->setControllerDirectory(APPLICATION_PATH . '/controllers');
Zend_Controller_Action_HelperBroker::addHelper(new Zend_Layout_Controller_Action_Helper_Layout);
}


public function testSubscriptionStatus()
{
try{
$this->dispatch('/my/subscriptionstatus');
$this->assertController('my');
$this->assertAction('subscriptionstatus');

} catch (Exception $e) {
print_r($e->getTrace());
}
}
}

在这里我们如何设置我们的测试模型:
<?php

class Model_CustomerTest extends ControllerTestCase
{
public function testDoSearch(){
$x = Customer::doSearch('s');
$this->assertTrue(count($x) > 0);
}

}

最后这里是在模型中有效但在 Controller 中无效的代码(运行 PHPUnit 时):
$registry = Zend_Registry::getInstance();
$options = $registry->webservices['logging'];

我们通过阅读网络上的几个不同资源来设置我们的 PHPUnit 测试环境。我们都不是 PHPUnit 专家。所以我们只是不知道发生了什么。

谢谢!

最佳答案

文档对此不是很清楚,但我认为 Controller 测试用例类实际上不应该进行引导,因为 PHPUnit 需要能够在每次测试之前执行此操作。至少这是我设置 Controller 基类(有效)的方式。因此,尝试将您的设置方法更改为:

public function setUp() {
$this->bootstrap = new Zend_Application(APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini');
parent::setUp();
}

关于unit-testing - 在 Zend 框架 1 应用程序中,PHPUnit 无法在 Controller 中加载 application.ini,但在模型中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15822673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com