2008-10-14 35 views
5

Trong CakePHP, đặt một chuỗi truy vấn trong url không khiến nó được phân tích cú pháp tự động và chia nhỏ như bình thường khi bộ điều khiển được gọi trực tiếp.Làm thế nào để vượt qua chuỗi truy vấn để testAction trong CakePHP 1.2?

Ví dụ:

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

sẽ cho kết quả:

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

Trong khi viện dẫn url trực tiếp thông qua các kết quả trình duyệt web trong:

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

Nếu không có chỉnh sửa nguồn CakePHP, có cách nào để phân tách chuỗi truy vấn khi chạy thử nghiệm đơn vị không?

Trả lời

3

Tôi có một bản hack (tức là có thể không hoạt động đối với các bản phát hành CakePHP trong tương lai) hoặc một tính năng không có giấy tờ.

Nếu tham số testAction thứ hai bao gồm một mảng có tên gọi là 'url' thì các giá trị sẽ được đặt trong đối tượng $ this-> params trong bộ điều khiển. Điều này cho chúng ta kết quả ròng giống như khi bộ điều khiển được gọi trực tiếp.

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

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

Tôi hài lòng với phương pháp này cho những gì tôi cần làm. Tôi sẽ mở câu hỏi cho cộng đồng ngay để nó trong tương lai một câu trả lời tốt hơn có thể được cung cấp.

+0

Điều này sẽ không hoạt động trong Bánh 1.3. Bạn nên thiết lập như sau trước khi testAction gọi: '$ this -> __ savedGetData ['company'] = 'utcompany';' –

0

CakePHP cung cấp một số cấp chia tách url nhưng dường như nó chỉ hoạt động trong cấu hình thời gian chạy chứ không phải cấu hình thử nghiệm. Tôi sẽ liên lạc với CakePHP nếu điều này là cố ý.

Tôi đề xuất cho trình phân tích cú pháp truy vấn của bạn sẽ sử dụng hàm PHP explode.

Tôi tin rằng bạn có thể làm một cái gì đó như thế này:

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

mà sẽ cung cấp cho bạn chìa khóa cặp của bạn trong khe mảng riêng biệt khi mà bạn có thể lặp lại và thực hiện một thứ hai phát nổ như vậy:

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

Tuy nhiên, tất cả điều này được cho là sẽ tốt hơn nếu nhìn trộm dưới nắp của CakePHP và xem họ đang làm gì.

Những gì tôi đã nhập ở trên sẽ không xử lý chính xác các tình huống trong đó chuỗi truy vấn của bạn chứa ký tự thoát HTML (bắt đầu bằng &), cũng như không xử lý chuỗi url được mã hóa hex.

-1

sử dụng _GET ['parmname'];

1

Không có câu nào trong số những câu trả lời này sẽ trở nên đáng lo ngại trong Bánh 1.3. Thay vào đó, bạn nên đặt các thông tin sau trước cuộc gọi testAction của mình:

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

Các vấn đề liên quan