Write a testing code of registration for the custom wp-cron event by using PHPUnit

We can register a single cron job by using the WordPress function named wp_schedule_single_event. But sometime […]

広告ここから
広告ここまで

目次

    We can register a single cron job by using the WordPress function named wp_schedule_single_event.

    wp_schedule_single_event( int $timestamp,  string $hook,  array $args = array(),  bool $wp_error = false )

    But sometimes, we want to check for is the cron job truly registered.

    And we can write a test code by using PHPUnit.

    Simply testing example

    First, we can test just a wp_schedule_single_event function.

    class Cron_Test extends \WP_UnitTestCase {
    
        function test_cron_registration() {
            $hook = __FUNCTION__;
            $timestamp = strtotime( '+1 hour' );
    
            $scheduled = wp_schedule_single_event( $timestamp, $hook_name );
    
            // Check is the job has been registered
            $this->assertTrue( $scheduled );
    
            // Check is the scheduled time is correct
            $this->assertSame( strtotime( '+1 hour' ), wp_next_scheduled( $hook ) );
    
            // It's a non-recurring event.
            $this->assertFalse( wp_get_schedule( $hook ) );
        }
    
    

    Ref: https://github.com/WordPress/wordpress-develop/blob/master/tests/phpunit/tests/cron.php#L39-L50

    Register the cron job conditionally

    If you want to register the job conditionally like the super simple example,

    function testing_target_function( $timestamp, $hook_name, $flag ) {
        if ( false === $flag ) {
            return false;
        }
        return wp_schedule_single_event( $timestamp, $hook_name );
    }

    we can test by the following code.

    class Cron_Test extends \WP_UnitTestCase {
    
        /**
         * @dataProvider provide_test_cron_registration_test_case
         */
        function test_cron_registration( $flag, $should_scheduled ) {
            $hook = __FUNCTION__;
            $timestamp = strtotime( '+1 hour' );
    
            $scheduled = testing_target_function( $timestamp, $hook, $flag );
            $this->assertEquals( $should_scheduled, $scheduled );
    
            if ( $should_scheduled ) {
                $this->assertSame( $timestamp, wp_next_scheduled( $hook ) );
            }
            // It's a non-recurring event.
            $this->assertFalse( wp_get_schedule( $hook ) );
        }
    
        function provide_test_cron_registration_test_case() {
            return [
                [ false, false ],
                [ true, true ],
            ];
        }
    }

    広告ここから
    広告ここまで

    Random posts

    Home
    Search
    Bookmark