我正在为我开发的插件编写一些单元测试。然而,我似乎对测试一段(看似)简单的代码很感兴趣。
在我编写的插件中,我注册了一个管理菜单页面:
add_menu_page(
esc_html__( \'Places\', \'wp-places\' ),
esc_html__( \'Places\', \'wp-places\' ),
\'manage_options\',
\'wp-places\',
[ $this, \'places_page\' ],
);
但我似乎无法想出一个单元测试来确保这个菜单项存在。我看到了
global $menu
, 但当我检查全局时,它还没有设置。
以下是我所拥有的基本知识。
<?php
class AdminTests extends WP_UnitTestCase {
public function setUp() {
parent::setUp();
wp_set_current_user( self::factory()->user->create( [
\'role\' => \'administrator\',
] ) );
$this->go_to( admin_url() );
}
public function test_admin_menu() {
global $menu;
print_r( $menu ); // not set
}
}
最合适的回答,由SO网友:J.D. 整理而成
而不是担心菜单代码的内部实现及其使用的全局变量(下面有几个$menu
), 我会使用如下函数menu_page_url()
检查页面是否存在。如果菜单已注册,该函数将返回URL;如果未注册,则返回空字符串。因此,您可以:
$this->assertNotEmpty( menu_page_url( \'my_menu_slug\' ) );
此外,您没有正确设置测试。这个
go_to()
方法仅设置主
WP_Query
对象,它不适用于管理员URL。您需要调用注册管理菜单的函数。所以你的测试看起来更像这样:
class AdminTests extends WP_UnitTestCase {
public function setUp() {
parent::setUp();
wp_set_current_user( self::factory()->user->create( [
\'role\' => \'administrator\',
] ) );
}
public function test_admin_menu() {
my_admin_menu_registration_func();
$this->assertNotEmpty( menu_page_url( \'my_menu_slug\' ) );
}
}