我是 Zend Framework 的新手,正在尝试在 Zend 中实现一个 RESTful 控制器并尝试为我的控制器编写单元测试。我正在关注 REST API,网址为:https ://github.com/codeinchaos/restful-zend-framework但对于每种测试,PHPUnit 总是达到 404(可通过断言响应代码来观察 - 我期望的那个和那个PHPUnit 收到),因此测试失败。
我已经在各个文件中添加了所有代码,因为这个 REST API 的自述文件指示:
• 我添加了一个特定于 REST 的模块:/application/modules/api。• 在我的application.ini 中,我有以下内容:
autoloaderNamespaces[] = "REST_"
rest.default = "xml"
rest.formats[] = "json"
rest.formats[] = "xml"
resources.frontController.plugins.ErrorHandler.class = "Zend_Controller_Plugin_ErrorHandler"
resources.frontController.plugins.ErrorHandler.options.module = "default"
resources.frontController.plugins.ErrorHandler.options.controller = "error"
resources.frontController.plugins.ErrorHandler.options.action = "error"
resources.router.routes.rest.type = Zend_Rest_Route
• 在我的应用程序/bootstrap.php 中:
public function _initREST()
{
$frontController = Zend_Controller_Front::getInstance();
// set custom request object
$frontController->setRequest(new REST_Request);
$frontController->setResponse(new REST_Response);
$frontController->addModuleDirectory(APPLICATION_PATH . '/modules');
// Add the REST route for the API module only
$restRoute = new Zend_Rest_Route($frontController, array(), array('api'));
$frontController->getRouter()->addRoute('rest', $restRoute);
}
• 在我的 /application/modules/api/Bootstrap.php 中:
public function _initREST()
{
$frontController = Zend_Controller_Front::getInstance();
// Register the RestHandler plugin
$frontController->registerPlugin(new REST_Controller_Plugin_RestHandler($frontController));
// Add REST contextSwitch helper
$contextSwitch = new REST_Controller_Action_Helper_ContextSwitch();
Zend_Controller_Action_HelperBroker::addHelper($contextSwitch);
// Add restContexts helper
$restContexts = new REST_Controller_Action_Helper_RestContexts();
Zend_Controller_Action_HelperBroker::addHelper($restContexts);
}
• 在我自己的实验中,我还在 /public/index.php 中添加了一行 $autoloader->registerNamespace('REST_'),其中 $autoloader 引用 Zend_Loader_Autoloader 的一个实例。
• 我的测试位置:/tests/application/modules/api/controllers/RestClassTest.php • 这是我对getAction() 的测试之一:
public function testGetAction()
{
$this->request->setMethod('GET');
// Have tried other variations of URI too but all bear same result (getting 404) in tests indicating that routing is not set at the fundamental level.
$this->dispatch('/api/learn-to-rest?id=51fc287fc55ffc4006410bca');
$body = $this->getResponse()->getBody();
$json = json_decode($body, true);
$this->assertEquals('John Doe', $json['name']);
$httpResponse = $this->getResponse()->getHttpResponseCode();
$this->assertEquals(200, $httpResponse);
}
• 这是我的getAction():
public function getAction()
{
$request = $this->getRequest();
$objectId = $request->getParam('id');
// Validation for ID
$this->_validateMongoObjectIdAction($objectId);
// Perform DB record selection
$records = new Db_Collection_Class(new Db_Mongo_Class);
$result = $records->findInCollection(array('_id' => new MongoId($objectId)));
if ($result === null) {
// Source: http://www.w3.org/Protocols/HTTP/HTRESP.html
$this->getResponse()->setHttpResponseCode(404);
}
// Dispatch records in JSON format
$this->_helper->json($result);
}
确实,我为未找到结果的情况设置了 404,但特别限制在 getAction,它也通过测试识别的有效 ID 达到 404。
我检查了许多资源(包括此 API 提供的示例和 Matthew O'Phinney 的帖子:http ://www.mwop.net/blog/228-Building-RESTful-Services-with-Zend-Framework.html )并全部指示遵循我已经在做的同样的事情。很明显,我错过了他们所说的或不理解某些因素的东西。如果有人指导我做错了什么,我将不胜感激。
提前致谢。