这是一个关于使用面向对象的代码原则在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()
语句(require
的使用在我看来就像程序代码味道一样)? 答案 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自动加载器。然后,您不需要在测试中要求任何类。