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
'programing' 카테고리의 다른 글
FLT_MIN이 0인 이유는 무엇입니까? (0) | 2023.11.01 |
---|---|
PHP PDO 대 normal mysql_connect (0) | 2023.11.01 |
Get Value of Radio 버튼 그룹 (0) | 2023.10.27 |
중첩된 내용이 후속 버전에 포함됩니까? (0) | 2023.10.27 |
ExtractValue()가 업데이트에서 실패하고 SELECT에 성공하는 이유는 무엇입니까? (0) | 2023.10.27 |