在ZF2 OO PHPUnit测试用例代码中使用require / require_once()语句是否正确?

时间:2013-12-06 22:42:04

标签: php zend-framework zend-framework2 phpunit

这是一个关于使用面向对象的代码原则在Zend Framework 2中正确编写PHPUnit测试的问题。

我有以下PHPUnit测试用例:

namespace FedcoUserTest;
use FedcoUser\Controller\MachinistController;

class MachinistControllerTest extends Framework\TestCase
{...}

我的MachinistController类是这样的:

namespace FedcoUser\Controller;

class MachinistController extends \ZfcUser\Controller\UserController
{...}

尝试运行测试用例时,我会收到此错误:

Debug Error: MachinistController.php - Class 'ZfcUser\Controller\UserController' not found

这很奇怪,因为我的MachinistController类运行得很好,并且在作为Web应用程序运行时找到了ZfcUser的控制器,而不是通过PHPUnit Test。

不知何故,我决定提出一个

require_once 'vendor/zf-commons/zfc-user/src/ZfcUser/Controller/UserController.php';

进入我的MachinistControllerTest类,现在我的PHPUnit测试运行没有错误。

我发现这很奇怪。

为什么:到目前为止,根据我使用ZF2的经验,我没有必要使用require函数。 ZF2完全是OO,为什么现在呢?它可能是正确的,但是有更好的方法,如果有,它是什么?

更具体的问题:

  • (正确性)我是否有权在我的代码中使用此require_once行来使测试用例通过?
  • (ZF2最佳实践)为什么我会在我的完全OO ZF2代码中使用require_once()语句(require的使用在我看来就像程序代码味道一样)?
  • (OO最佳实践)当我的MachinistController完全扩展它时,为什么没有找到ZfcUser的控制器?

3 个答案:

答案 0 :(得分:1)

我最终在TestConfiguration.php文件中的配置中加载了其他命名空间:

$additionalNamespaces = array(
    'ZfcUser\Controller' => __DIR__ . '/../../../vendor/zf-commons/zfc-user/src/ZfcUser/Controller/'
);

很适合我的bootstrap.php,它有以下代码:

// setup autoloader
AutoloaderFactory::factory(
    array(
        'Zend\Loader\StandardAutoloader' => array(
            StandardAutoloader::AUTOREGISTER_ZF => true,
            StandardAutoloader::ACT_AS_FALLBACK => false,
            StandardAutoloader::LOAD_NS => $additionalNamespaces,
        )
    )
);

答案 1 :(得分:0)

请不要忘记PHPUnit Tests不是ZF2框架的一部分。 ZF2不负责单元测试文件中的自动加载类。

您需要自己模拟课程http://phpunit.de/manual/3.6/en/test-doubles.html#test-doubles.mock-objects并负责自己要求所有课程。

答案 2 :(得分:0)

通常,在运行测试之前,您将使用PHPUnit的引导功能来引导应用程序的某些元素(包括自动加载器)。手册中有一个示例引导程序:http://framework.zend.com/manual/2.0/en/user-guide/unit-testing.html。就个人而言,我使用了一个略微修改过的版本,它也引入了Composer自动加载器。然后,您不需要在测试中要求任何类。