如何在CakePHP 1.2中将查询字符串传递给testAction?

时间:2008-10-14 12:22:46

标签: php unit-testing cakephp cakephp-1.2

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

例如:

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

将导致:

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

通过网络浏览器直接调用网址会导致:

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

在不编辑CakePHP源代码的情况下,运行单元测试时是否有某种方法可以将查询字符串拆分?

4 个答案:

答案 0 :(得分:3)

我有什么是黑客(即可能不适用于未来的CakePHP版本)或未记录的功能。

如果第二个testAction参数包含一个名为'url'的命名数组,那么这些值将放在控制器中的$ this-> params对象中。这给了我们与直接调用控制器时相同的净结果。

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

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

我对这个方法感到满意,因为我需要做什么。我将很快向社区公开这个问题,以便将来能够提供更好的答案。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

CakePHP确实提供了一定级别的url拆分,但它似乎只适用于运行时配置而不是测试配置。如果是故意的话,我会联系CakePHP。

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

我相信你可以这样做:

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

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

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

然而,所有这一切都被认为最好在CakePHP的引擎盖下偷看,看看他们在做什么。

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

答案 3 :(得分:-1)

使用_GET ['parmname'];