2016-08-12 15 views
5

Tôi vừa bắt đầu học PHPUnit với Wordpress. Tôi có một plugin nhận dữ liệu kiến ​​nghị từ change.org. Một trong các hàm lớp quản trị xác nhận các thiết lập từ một khu vực quản trị Wordpress và cũng gọi `check_admin_referer() như là một phần của việc xác thực này.Làm cách nào để PHPUnit kiểm tra hàm Wordpress có chứa check_admin_referer()?

public function sc_validate_settings() { 
    //check nonce field is valid 
    check_admin_referer($this->plugin_name, 'security');  

    //get new settings 
    $settings = $this->sc_clean_new_settings(); 

    //validate url 
    $valid_url = $this->sc_validate_url($settings['petition_url']); 

    //validate api_key 
    $valid_api_key = $this->sc_validate_api_key($settings['petition_api_key']); 

    if ($valid_url && $valid_api_key) { 

     $this->clean_settings = $settings; 
     return true; 

    } 

    return false; 

    } 

Kiểm tra PHPUnit này vượt qua nếu tôi nhận xét check_admin_referer() nhưng tôi không thể chuyển qua nếu không.

public function testValidateSettings() {  

    $this->assertTrue($this->plugin_admin->sc_validate_settings()); 

    } 

Tôi đã cố gắng thiết lập một nonce, hành động và _wp_http_referer bằng tay và thông qua wp_nonce_field() qua $_POST trong các thử nghiệm/bootstrap.php và trong lớp thử nghiệm bản thân. Và tôi đã đọc một chút về các đối tượng giả/phương pháp nhưng không hoàn toàn nhìn thấy cách chúng có thể được sử dụng trong trường hợp này.

Tôi có thể hoàn toàn hiểu nhầm cách thức hoạt động của mọi việc nhưng mọi trợ giúp sẽ được đánh giá cao!

Trả lời

6

Vấn đề là các thử nghiệm chạy ở chế độ dòng lệnh và tất nhiên, người dùng hiện tại không được xác thực ở đó.

Có một vài lựa chọn thay thế để làm cho nó hoạt động. Một lựa chọn là để khai báo chức năng kiểm tra auth-check check_admin_referer() hoặc bên dưới của nó wp_verify_nonce(). Nhưng nó không phải là cách tiếp cận tốt nhất, như các xét nghiệm có hương vị tích hợp, trong khi stubbing là một cách tiếp cận cho các bài kiểm tra đơn vị.

Giải pháp tốt là xác thực người dùng để thực hiện các bài kiểm tra. Bạn có thể làm điều đó tương đối dễ dàng như thế này:

public function testValidateSettings() { 
    $_REQUEST['security'] = wp_create_nonce($this->plugin_admin->plugin_name); 

    $this->assertTrue($this->plugin_admin->sc_validate_settings()); 
} 

Tôi không tự tin rằng sẽ làm việc, vì nó có thể là một tài sản cá nhân. Vì vậy, bạn chỉ có thể vượt qua nó như là một chuỗi mã hóa cứng:

public function testValidateSettings() { 
    $_REQUEST['security'] = wp_create_nonce('whatever your plugin name is'); 

    $this->assertTrue($this->plugin_admin->sc_validate_settings()); 
} 

Ngoài ra nó sẽ là tuyệt vời để dọn dẹp sau khi thử nghiệm của bạn, vì vậy bạn chắc chắn nên có điều này trong trường hợp thử nghiệm của bạn:

public function tearDown() { 
    unset($_REQUEST['security']); 
} 

I don' t nghĩ rằng bạn cần phải làm sạch nonce mới được tạo ra sau khi các bài kiểm tra, bởi vì các bài kiểm tra ban đầu WP không làm sạch đó là tốt.

Điều đó thật tuyệt.


Cải thiện

Nếu tất cả các bài kiểm tra của bạn trong trường hợp kiểm tra yêu cầu xác thực, bạn có thể muốn đặt nonce-tạo thành setUp() - điều này sẽ làm cho các trường hợp thử nghiệm đẹp hơn, như giọt nước mắt xuống mã sẽ phù hợp với thiết lập một:

public function setUp() { 
    $_REQUEST['security'] = wp_create_nonce('whatever your plugin name is'); 
} 

public function tearDown() { 
    unset($_REQUEST['security']); 
} 

public function testValidateSettings() { 
    $this->assertTrue($this->plugin_admin->sc_validate_settings()); 
} 

Đề xuất

Cài đặt Xdebug và kết nối với nó qua IDE của bạn - điều này sẽ giúp bạn thực hiện từng bước mã và xem những gì không hoạt động như bạn mong đợi. Điều này là tốt hơn, hơn là đấu tranh một cách mù quáng với tất cả các nonces, http referrers, v.v.


Note

Mã WP là khá buồn. Danh sách hàm lớn trong không gian tên chung, thiếu OOP, không có chu kỳ xử lý yêu cầu (ví dụ: die()) bất ngờ - thực sự bực bội, vì nó làm cho việc mở rộng mã nguồn và thử nghiệm thực sự khó khăn.

Vì vậy, hãy chuẩn bị cho chiến đấu nhiều hơn với các mã :)

+0

Hi @ Andrey-tserkus, cảm ơn đã dành thời gian để cung cấp một câu trả lời chi tiết và bối cảnh. Nó đã làm việc! Tôi cần phải chuyển tên plugin dưới dạng chuỗi được mã cứng như bạn đã đề xuất. Lời khuyên tốt để bao gồm trong setUp() quá cho prettiness! Cảm ơn một lần nữa - Tôi sẽ chuẩn bị cho chiến đấu trong tương lai với mã WP! –

+0

Vui khi được trợ giúp, @EdPatrick –

+0

Cảm ơn, @AndreyTserkus. Câu trả lời này cũng giúp ích nhiều nhất cho tôi. Tôi không thể có được khía cạnh $ _REQUEST để làm việc nhưng được phát hiện nếu tôi đặt người dùng hiện tại, 'wp_verify_nonce' sẽ hoạt động. Đã viết một bài đăng ngắn có thể giúp những người khác thử nghiệm WordPress. [wp_verify_nonce và PHPUnit] (http://jhtechservices.com/wp_verify_nonce-and-phpunit-testing/) – jer0dh

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