how to set context in WordPress for unit testing

I have created a wordpress plugin which converts shortcodes to content based on the entry saved on the dataase:

    global $wpdb;

    $post_id = get_the_ID();
    $post_content = get_the_content();

    $pattern = '/\[zam_tweets page=([0-9])\]/';
    preg_match($pattern, $post_content, $matches);

    if(!empty($matches)){

        $tweets_table = $wpdb->prefix . 'zam_tweets';
        $result = $wpdb->get_var("SELECT tweet FROM $tweets_table WHERE post_id = '$post_id'");
        $content = $result;
    }

    return $content;

My problem is how do I set the context to be that of a specific post so that I will get an actual post id when using the get_the_ID() method. Is this how I’m supposed to go with this or do I just have to specify them as arguments?

1 Answer
1

If you have phpUnit configured for testing a WP plugin, you can use a test case like this:

In your plugin-directory/tests/Some_Test_Case.php:

class Plugin_Test extends WP_UnitTestCase {
    /**
     * @dataProvider post_IDs_and_expected_results
     */
    public function test_something( $post_id, $expected_result ) {
        global $post;
        $post = get_post( $post_id );
        $plugin_content = call_plugin_function(); // Your function name here
        $this->assertEquals( $expected_result, $plugin_content, "Content OK for post $post_id" );
    }
    public function post_IDs_and_expected_results() {
        return array(
            array( 1, 'expected result for post_id = 1' ),
            array( 2, 'expected result for post_id = 2' )
        );
    }

}

Command line in your plugin’s directory: phpunit ./tests/Some_Test_Case.php

Leave a Comment