我正在学习Zend和PHPUnit。
以下是我的内容
public function changeToIllegalState()
{
return array(
array( Application_Model_SomeModel::FAIL ),
array( Application_Model_SomeModel::SUCCESS )
);
}
/**
* @dataProvider changeToIllegalState
* @expectedException IllegalStateChangeException
*/
public function testIllegalStateChangeGeneratesException( $state )
{
$mapper = new Application_Model_Mapper_SomeModel();
$model = new Application_Model_SomeModel();
$model->changeState( $state );
$mapper->save( $model );
}
正如您在此处所看到的,数据提供程序提供了一些表示模型中不同状态的常量。
PHPUnit说它无法在dataprovider方法中找到Model类。但是,如果我尝试在测试方法中使用常量,那么一切正常并且没有问题。我正在使用Zend自动加载器来加载我的课程,到现在为止它一直很花哨。我知道我可以直接输入常量的值,但我不知道为什么我会收到这个错误。
我只能假设在调用setup方法之前调用了dataprovider方法,因为我在setup方法中执行了所有自动加载业务。
编辑:
我也尝试了以下内容,但它仍然不适用于类consts。
protected $_FAIL;
protected $_model;
public function setUp()
{
parent::setUp();
$this->_model = new Application_Model_SomeModel();
$this->_FAIL = Application_Model_SomeModel::FAIL;
}
现在,当我尝试在provider方法中使用$ _FAIL时,我得到一个NULL值而不是我期望的'fail'字符串。这真的很奇怪。
答案 0 :(得分:4)
PHPUnit实例化将在运行任何测试之前运行的所有测试用例。
假设您在bootstrap.php中设置了自动加载器,它应该加载包含这些常量的类。但是,我会尝试测试看看:
public function changeToIllegalState()
{
require_once 'Zend/Loader/Autoloader';
Zend_Loader_Autoloader::getInstance();
return array(
array( Application_Model_SomeModel::FAIL ),
array( Application_Model_SomeModel::SUCCESS )
);
}
或者是Zend Framework将模型的目录添加到测试用例setUp()
方法之一的包含路径中?
答案 1 :(得分:3)
我终于想出了发生了什么。
PHPUnit会在调用任何设置方法之前调用类的所有dataprovider方法,这包括静态方法setUpBeforeClass。
我在数据提供程序方法和setUp方法中放入了一堆echo语句来确认这一点。所有提供程序方法echos始终在安装方法回声之前打印。
此外,只有在使用dataprovider注释将方法声明为数据提供者时,才会回显提供者方法的回声。也就是说,任何未声明为带有注释的dataprovider方法的方法都不会被调用。
我最初假设PHPUnit在我的setUp方法之前调用提供者方法是正确的。
要解决此问题,我必须在引导程序文件中而不是在setUp方法中实例化我的Zend_Application对象。我不想这样做,因为我不需要所有测试用例的Zend_Application对象,但我认为这是我最终会做的事情,因为它会让我的生活变得更轻松。
@David Harkness你是正确的在这种情况下在引导程序中设置自动加载器,但我还需要设置应用程序自动加载(通过制作Zend_Application对象),而不仅仅是Zend库自动加载。