我想知道如何在zend框架中测试模型,我已经在zend项目中测试了一个控制器。
我的phpunit.xml是:
<phpunit bootstrap="./bootstrap.php" colors="true">
<testsuite>
<directory>./</directory>
</testsuite>
<filter>
<whitelist>
<directory suffix="MyApp.php">../application/</directory>
<exclude>
<file>../application/Bootstrap.php</file>
<file>../application/controllers/ErrorController.php</file>
<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与phpunit.xml相同的文件夹
<?php
error_reporting(E_ALL);
// 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'),
realpath(APPLICATION_PATH . '/../tests'),
get_include_path(),
)));
require_once 'Zend/Application.php';
require_once './application/controllers/ControllerTestCase.php';
ControllerTestCase.php是:
<?php
require_once 'Zend/Application.php';
require_once 'Zend/Test/PHPUnit/ControllerTestCase.php';
class ControllerTestCase
extends Zend_Test_PHPUnit_ControllerTestCase
{
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();
}
}
我使用了ControllerTestCase作为基础,并为控制器编写了一个测试用例,并且它可以工作,但我不知道如何为模型编写测试用例,模型的测试用例还应该扩展ControllerTestCase?或者它应该扩展Zend_Test_PHPUnit_Db?由于模型将连接到数据库,所以我该如何测试呢?谁可以帮我这个事?例如,我有一个模型:
<?php class Application_Model_User2 extends Custom_Model_Base {
public function __construct() {
parent::__construct();
}
static function create(array $data) {
return parent::_create(
$_table,
get_class(),
$data,
self::$_columns,
true
);
}
}
如何测试?
答案 0 :(得分:1)
他们应该扩展PHPUnit_Framework_TestCase
而不是ControllerTestCase
。
您将模型作为功能单元而不是控制器进行测试,因此模型是一个独立的代码段,应该能够与您的应用程序及其控制器分开操作。
您没有专门测试数据库,因此您无需扩展Zend_Test_PHPUnit_Db
。
您的PHPUnit设置应该足以启动您的应用程序,以便配置Zend和任何自动加载器,以便加载您的模型。然后,您的测试类应该只测试模型代码的元素,而不是测试应用程序的任何其他元素。
修改强>
因此,请考虑在类Application_Model_User2
中测试以下函数:
static function find($name, $order=null, $limit=null, $offset=null)
{
return self::_selectAndBind(get_class(),
self::getDefaultAdapter()
->select()
->from($_table)
->where('name = ?', array($name))
->order($order)
->limit($limit, $offset)
);
}
在扩展PHPUnit_Framework_TestCase
的测试类中,此处是how-to以及docs和Asset Functions,您可能会遇到以下情况:
require_once 'PHPUnit/Framework.php';
class Application_Model_User2Test extends PHPUnit_Framework_TestCase
{
public function testFind()
{
// Get a result from the function we are testing
$result = Application_Model_User2::find("foo", "date", 10, 0);
// Test that there are 10 results
$this->assertEquals(10, count($result));
}
}
您还可以使用assertGreaterThan()
等函数来确定订单是否正确。
注意。这只是一个简单的例子。