5

在 CakePHP 中,将查询字符串放在 url 中不会导致它像通常直接调用控制器时那样被自动解析和拆分。

例如:

$this->testAction('/testing/post?company=utCompany', array('return' => 'vars')) ;

将导致:

[url] => /testing/post?company=utCompany

通过 Web 浏览器直接调用 url 会导致:

[url] => Array
    (
        [url] => testing/post
        [company] => utCompany
    )

在不编辑 CakePHP 源代码的情况下,有没有办法在运行单元测试时拆分查询字符串?

4

4 回答 4

3

I have what is either a hack (i.e. may not work for future CakePHP releases) or an undocumented feature.

If the second testAction parameter includes an named array called 'url' then the values will be placed in the $this->params object in the controller. This gives us the same net result as when the controller is directly invoked.

$data = array ('company' => 'utCompany') ;

$result = $this->testAction('/testing/post', array
(
    'return' => 'vars', 
    'method' => 'get', 
    'url' => $data)
) ; 

I'm satisfied with this method for what I need to do. I'll open the question to the community shortly so that it in the future a better answer can be provided.

于 2008-10-14T13:18:06.467 回答
1

这些答案都不适用于 Cake 1.3。您应该在 testAction 调用之前设置以下内容:

$this->__savedGetData['company'] = 'utcompany';

于 2011-02-09T15:50:42.290 回答
0

CakePHP 确实提供了某种程度的 url 拆分,但它似乎只在运行时配置中工作,而不是在测试配置中工作。如果这是故意的,我会联系 CakePHP。

我建议您的查询字符串解析器使用 PHP 函数explode

我相信你可以做这样的事情:

$result = explode ('&', $queryString, -1) ;

这将为您提供单独的数组插槽中的密钥对,您可以在其上迭代并执行第二次爆炸,如下所示:

$keyPair = explode ('=', $result[n], -1) ;

然而,话虽如此,最好还是看看 CakePHP 的底层,看看他们在做什么。

我在上面输入的内容无法正确处理查询字符串包含 html 转义字符(以 & 为前缀)的情况,也不会处理十六进制编码的 url 字符串。

于 2008-10-14T14:43:16.607 回答
-1

使用 _GET['parmname'];

于 2009-11-03T09:13:40.830 回答