使用Slim测试PUT参数值的问题

时间:2014-02-09 13:34:52

标签: php phpunit slim

我不完全理解它与PUT变量和Slim的关系。

请考虑以下路线:

$app->put('/users/me',function() use ($app){
    $app->response->headers->set('Content-Type', 'application/json');
    $userData = $app->request()->put();
    var_dump($userData);
});

此路由基本上接受PUT请求并返回随附的任何变量。当我用curl测试它时,似乎按预期工作:

oris@oris:~/slim-api$ curl -i -H "Accept: application/json" -X PUT -d "hello=there" http://slim-api.com/users/me
HTTP/1.1 200 OK
Server: nginx/1.2.1
Date: Thu, 06 Feb 2014 09:53:11 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.4.6-1ubuntu1.5
Set-Cookie: PHPSESSID=2r6ta2fg6vdk7; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

array(1) {
    ["hello"]=>
    string(5) "there"
}

我用这个bootstrap.php file

为这条路线写了一个小的PHPUnit测试
 public function testPutUsersMe()
{
    $this->put('/users/me',array("myKey=myValue"));
    $userResponse = $this->response->body();
    var_dump($userResponse);
}

我还在此引导程序文件中添加了一个小小的附加内容,以便在每个请求中更新超全局:

//sets php super globals so other packages would have access to them on tests context
public function setRequestGlobals($method,$path,$options = array())
{
    $_SERVER['REQUEST_METHOD'] = $method;
    if (!empty($options)){
        if ($method === "GET"){
            foreach($options as $key => $value){
                $_GET[$key] = $value;
            }
        }
        if ($method === "POST"){
            foreach($options as $key => $value){
                $_POST[$key] = $value;
            }
        }
        if ($method === "PUT"){
            foreach($options as $key => $value){
                $_POST[$key] = $value;
            }
        }
    }

}

我在$this->setRequestGlobals($method,$path,$options);方法中调用request。 但是这会导致以下响应并不完全正确:

oris@oris:~/slim-api$ phpunit
PHPUnit 3.7.29 by Sebastian Bergmann.

Configuration read from /home/oris/slim-api/phpunit.xml

...........string(44) "Array
(
    [slim.input] => myKey=myValue
)
"


Time: 119 ms, Memory: 7.75Mb

OK (11 tests, 85 assertions)
oris@oris:~/slim-api$ 

我的意思是“不太正确”是[slim.input]现在是参数值,键和值是值。如果我将路径(和测试)方法更改为POST,我会得到预期的期望输出:

oris@oris:~/slim-api$ phpunit
PHPUnit 3.7.29 by Sebastian Bergmann.

Configuration read from /home/oris/slim-api/phpunit.xml

...........string(33) "Array
(
    [myKey] => myValue
)
"


Time: 128 ms, Memory: 7.75Mb

OK (11 tests, 85 assertions)
oris@oris:~/slim-api$ 

问题:

  • 一般情况下,我如何将带有curl的数组传递给此路由而不是flat key1 = value1,key2 = value2?

  • 当唯一改变的是请求方法时,为什么测试输出会发生这种变化?

奇怪的是,当我稍微深入了解Slim代码时,/vendor/slim/slim/Slim/Http/Request.php我发现put函数只是post的别名:

    /**
 * Fetch PUT data (alias for \Slim\Http\Request::post)
 * @param  string           $key
 * @param  mixed            $default Default return value when key does not exist
 * @return array|mixed|null
 */
public function put($key = null, $default = null)
{
    return $this->post($key, $default);
}

1 个答案:

答案 0 :(得分:0)

据我所知,slim需要首先配置标头以接受'PUT'方法 要么 您需要将'_METHOD=PUT'的参数与数据数组一起添加,然后将请求发送为'POST'。 传递的参数可能如下所示:array("_METHOD"=>"PUT","data"=>array("myKey"=>"myValue"))