2

这是我对创建功能的单元测试:

  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);
  }

但似乎 $data 总是空白。我在部分编写单元测试时错了吗?当我尝试将 curl POST 与 一起使用时-d,$data 具有我通过 发布的价值curl。我很困惑这里有什么问题?

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

回答

我想出了我成功的单元测试http://pastebin.com/fwFe0Mi3

有关更多信息,我使用此模块来实现 restful 控制器

4

1 回答 1

3

如果您查看 \Zend\Mvc\Controller\AbstractRestfulController 方法 processPostData,您会注意到在您的控制器中创建的方法被赋予了来自请求对象的 post 参数数组。

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

现在子类 \Zend\Http\PhpEnvironment\Request (当你请求某些东西时由 ZF2 使用)在实例化(__contruct 方法)上扩展 \Zend\Http\Request(上)调用 setPost 方法(上)给它 $ _POST 数组。

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

现在到你的代码。

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

尝试这样做,如果你仍然遇到问题,我会尽快给你一个例子。

于 2013-01-08T08:18:18.993 回答