programing

check_admin_referer()가 포함된 Wordpress 함수를 PHP unit에서 어떻게 테스트하시겠습니까?

newsource 2023. 11. 1. 22:22

check_admin_referer()가 포함된 Wordpress 함수를 PHP unit에서 어떻게 테스트하시겠습니까?

워드프레스로 PHPU 유닛을 막 배우기 시작했습니다.change.org 에서 청원 데이터를 가져오는 플러그인이 있습니다.관리 클래스 함수 중 하나는 Wordpress 관리 영역에서 설정을 검증하고 이 검증의 일부로 '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;

  }

이 PHPUnit 테스트는 내가 코멘트를 하면 통과합니다.check_admin_referer()그렇지 않으면 통과할 수가 없어요

  public function testValidateSettings() {    

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

  }  

수동으로 nonce, action 및 _wp_http_referer를 설정해 보았습니다.wp_nonce_field()경유로$_POST테스트/부트스트랩에서. php와 테스트 클래스 자체에서.그리고 저는 모의 물체/방법에 대해 조금 읽었지만 이 경우에 그것들이 어떻게 사용될 수 있는지 잘 알지 못합니다.

저는 아마도 이 모든 것이 어떻게 작동하는지 완전히 오해하고 있지만 어떤 도움이라도 대단히 감사할 것입니다!

문제는 테스트가 명령줄 모드에서 실행되며, 물론 현재 사용자는 해당 모드에서 인증되지 않습니다.

작동하는 방법에는 몇 가지 대안이 있습니다.한 가지 옵션은 인증 확인 함수 중 하나를 스텁하는 것입니다.check_admin_referer()또는 그 근본이 되는wp_verify_nonce(). 그러나 이 방법은 최적의 방법이 아닙니다. 통합의 맛이 있는 테스트가 있는 반면 스터브는 단위 테스트에 더 적합하기 때문입니다.

좋은 해결책은 테스트를 통과하기 위해 사용자를 인증하는 것입니다.이렇게 비교적 쉽게 할 수 있습니다.

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

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

저는 그것을 확신할 수 없습니다.$this->plugin_admin->plugin_name사유지일 수도 있기 때문에 효과가 있을 겁니다따라서 하드코딩된 문자열로 전달할 수 있습니다.

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

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

또한 시험이 끝난 후에는 정리하는 것이 좋을 것이므로, 시험 케이스에는 반드시 다음과 같은 것이 있어야 합니다.

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

WP 오리지널 테스트에서는 non도 cleaning하지 않기 때문에 새로 생성된 non은 테스트 후에 cleaning할 필요가 없다고 생각합니다.

너무 예뻐요.


개선.

테스트 케이스에 포함된 모든 테스트에서 인증이 필요한 경우에는 nonce-creation을setUp()- 이렇게 하면 테스트 케이스가 더 예뻐집니다. 분해 코드가 설정 코드와 일치하기 때문입니다.

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());
}

제안.

Xdebug를 설치하고 IDE를 통해 Xdebug에 연결합니다. 이렇게 하면 코드를 단계별로 살펴 보고 원하는 대로 작동하지 않는 것을 확인할 수 있습니다.이것은 모든 논스, http 레퍼러 등과 맹목적으로 씨름하는 것보다 낫습니다.


메모

WP 코드는 꽤 슬픕니다.글로벌 네임스페이스의 방대한 함수 목록, OOP 부족, 요청 처리를 위한 전체 주기 없음(예: 예상치 못한 경우)die()) - 코드베이스 확장과 테스트를 정말 어렵게 만들기 때문에 정말 실망스럽습니다.

그러니 코드로 더 많은 싸움을 준비하세요 :)

언급URL : https://stackoverflow.com/questions/38922259/how-would-you-phpunit-test-a-wordpress-function-containing-check-admin-referer