我在使用PHPUnit和Zend_Test以及模拟对象时遇到了问题。我正在使用Keith Pope的结构来学习单元测试。我在tests / modules / default / controllers中进行了Controller测试,在tests / modules / default / models中进行了单元测试。 models目录中还有一个名为TestResources的子目录,其中包含创建模拟对象的文件。
有一个名为Default_Model_UserTest的模型单元测试。它继承自ControllerTestCase,它具有用于所有测试的设置功能。在Default_Model_UserTest中,附加设置强制测试使用TestResources文件夹中的User.php作为资源。设置功能如下:
protected function setUp() {
parent::setUp();
// Replace Model Resources with TestResources
$autoloader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => dirname(__FILE__),
'namespace' => 'Default'
)
);
$autoloader->addResourceType('modelResource', 'TestResources', 'Resource');
$this->object = new Default_Model_User;
}
当我自己运行测试时,它可以使用模拟对象正常工作。我还有一个控制器测试,测试用户是否可以验证针对mysql数据库的哪些测试。当它运行Default_Model_UserTest时,它出现在CustomerControllerTest不在TestResources文件夹中使用User.php但它使用主应用程序目录中的资源User.php,因此它使用的是mysql数据库而不是模拟对象。我无法理解为什么。在尝试调试它时,我发现一旦运行了身份验证测试,它就会完全忽略TestResources文件夹中的User.php。
问题与测试没有正确复位有关我在ControllerTestCase.php中添加了拆解功能:
protected function tearDown()
{
Zend_Controller_Front::getInstance()->resetInstance();
$this->resetRequest();
$this->resetResponse();
$this->request->setPost(array());
$this->request->setQuery(array());
unset($_SERVER['DOCUMENT_ROOT']);
parent::tearDown();
}
CustomerControllerTest.php中的拆解功能是:
protected function tearDown()
{
Zend_Auth::getInstance()->clearIdentity();
Zend_Session::forgetMe();
parent::tearDown();
}
我找到了一个我能想到的问题的答案,但我找不到任何东西。我使用的是PHPUnit 3.5.11和Zend framework 1.11.3。如果有人对这种行为的原因有任何了解,我将非常感激。