3

我正在学习 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;
}

现在,当我尝试在提供程序方法中使用 $_FAIL 时,我得到一个 NULL 值而不是我期望的“失败”字符串。这真的很奇怪。

4

2 回答 2

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()方法之一的包含路径中?

于 2011-04-06T07:05:25.353 回答
3

我终于知道发生了什么事。

PHPUnit 将在调用任何设置方法之前调用类的所有 dataprovider 方法,这包括静态方法 setUpBeforeClass。

我在数据提供者方法和 setUp 方法中放入了一堆 echo 语句来确认这一点。所有提供者方法的回声总是在设置方法回声之前打印。

此外,提供者方法的回声仅在方法被声明为带有 dataprovider 注释的数据提供者时才会回显。也就是说,任何没有声明为带有注解的 dataprovider 方法的方法根本不会被调用。

我对 PHPUnit 在我的 setUp 方法之前调用提供程序方法的最初假设是正确的。

为了解决这个问题,我必须在引导文件中而不是在 setUp 方法中实例化我的 Zend_Application 对象。我不想这样做,因为我不需要所有测试用例的 Zend_Application 对象,但我认为这是我最终要做的,因为它会让我的生活更轻松一些。

@David Harkness 在这种情况下,您在引导程序中设置自动加载器是正确的,但我还需要设置应用程序自动加载(通过创建 Zend_Application 对象),而不仅仅是 Zend 库自动加载。

于 2011-04-06T19:08:01.790 回答