2013-01-08 16 views
2

这是我的单元测试的创建功能:Zendframework 2中的Restful控制器 - 它的参数是如何工作的?

public function testCreate() { 
    $this->routeMatch->setMatchedRouteName('restful'); 
    $this->request->setMethod('POST') 
        ->setContent('name=A'); 

    $result = $this->controller->dispatch($this->request); 
    $response = $this->controller->getResponse(); 

    $this->assertEquals(403, $response->getStatusCode()); 
    $this->assertArrayHasKey('id', $result); 
    } 

这是我的函数:

public function create($data) { 
    if (empty($data)) { 
     $this->response->setStatusCode(400); 
     return; 
    } 

    for ($i = 0; $i < count(self::$ideas); $i++) { 
     if (self::$ideas[$i]['name'] == $data['name']) { 
     $this->response->setStatusCode(404); 
     return; 
     } 
    } 

    //@todo: secure the API 
    self::$index++; 
    $tmpArray = array('id'=>self::$index, 'name'=>$data['name']); 
    $this->response->setStatusCode(403); 
    } 

但似乎$的数据始终是空白。在编写单元测试部分我错了吗? 当我尝试使用卷曲POST与-d时,$数据具有我通过curl发布的值。我很困惑这里有什么不对?

感谢您的阅读,并期待您的答案:)

回答

我已经与我的成功的单元测试http://pastebin.com/fwFe0Mi3

上前欲了解更多信息,我用this module实现宁静的控制器

+0

你能否粘贴你的路线配置? –

+0

@DanielM我使用#scaraveous模块:https://github.com/scaraveos/ZF2-Restful-Module-Skeleton – nXqd

回答

3

如果你看看\ Zend \ Mvc \ Controller \ AbstractRestfulController方法processPostData,你将会看到e在你的控制器中创建的方法被赋予一个来自请求对象的post params数组。

如果您看\ Zend \ Http \ Request $ postParams属性由setPost方法填充。

现在,在实例化(__contruct方法)上扩展\ Zend \ Http \ Request(上面)的孩子类\ Zend \ Http \ PhpEnvironment \ Request(用于请求某些东西的ZF2)调用setPost方法(上面)给它$ _POST数组。

这意味着最终ZF2会在内部为控制器的create方法提供$ _POST内容,而不是通过解析请求主体。

现在到你的代码。

如果没有事先设置事件框架,我认为dispatch不会执行任何操作。相反,您可以调用控制器执行方法,并为其提供MvcEvent。 MvcEvent需要你实例化的请求集。其次,如上所述,您需要调用请求的setPost并为其创建一个数组,以使create方法正常工作。 (另一方面PUT从请求主体读取数据)

试着这样做,如果你仍然遇到麻烦,我会尽力给你一个例子。

+0

感谢您的回答。我试图自己创建一个测试,看看我能不能拿出任何东西:) – nXqd

+1

让我知道它是怎么回事。现在在这里为时太晚:) – scaraveos

+0

感谢您的帮助@scaraveos。我想出了一个工作测试: http://pastebin.com/fwFe0Mi3 – nXqd

相关问题