PHPUnit,使用类consts来改变State

时间:2011-04-06 05:26:27

标签: zend-framework phpunit autoload dataprovider

我正在学习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'字符串。这真的很奇怪。

2 个答案:

答案 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库自动加载。