为Add_Menu_Page编写单元测试

时间:2017-07-21 作者:Gary

我正在为我开发的插件编写一些单元测试。然而,我似乎对测试一段(看似)简单的代码很感兴趣。

在我编写的插件中,我注册了一个管理菜单页面:

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

    }

}

1 个回复
最合适的回答,由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\' ) );
    }

}

结束

相关推荐