0

我是 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 )并全部指示遵循我已经在做的同样的事情。很明显,我错过了他们所说的或不理解某些因素的东西。如果有人指导我做错了什么,我将不胜感激。

提前致谢。

4

1 回答 1

0

如果您删除它是否有效:

$frontController->setRequest(new REST_Request);

在 _initRest() 中?

于 2013-08-19T06:50:38.800 回答