这是我对创建功能的单元测试:
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始终是空白的。我在编写单元测试时错了吗?
当我尝试使用-d
的curl POST时,$ data的值与我在curl
中发布的值一样。我很困惑这里有什么问题?
感谢您阅读并期待您的回答:)
答案
我想出了我成功的单元测试http://pastebin.com/fwFe0Mi3
有关更多信息,我使用this module来实现restful controller
答案 0 :(得分:3)
如果查看\ Zend \ Mvc \ Controller \ AbstractRestfulController方法processPostData,您会注意到在控制器中创建的方法会从请求对象中获得一个post params数组。
如果查看\ Zend \ Http \ Request,请使用setPost方法填充$ postParams属性。
现在子类\ Zend \ Http \ PhpEnvironment \ Request(当你请求某些东西时由ZF2使用)扩展\实例化上的\ Zend \ Http \ Request(上面)(__contruct方法)调用setPost方法(上面)给出它是$ _POST数组。
这意味着最终ZF2在内部使用$ _POST内容提供控制器的create方法,而不是通过解析请求体。
现在你的代码。
如果没有先设置事件框架,我认为dispatch不会做任何事情。相反,你可以调用控制器执行方法,为它提供一个MvcEvent。 MvcEvent需要具有您实例化的请求集。 其次,如上所述,您需要调用请求的setPost并为其提供一个数组,以使create方法正常工作。 (另一方面,PUT从请求体中读取数据)
尝试这样做,如果你仍然遇到麻烦,我会尽快给你一个例子。