Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introduction to WordPress unit testing

Introduction to WordPress unit testing

These are the slides from a talk given at WordCamp Toronto 2015.

“But this worked the other day!” We’ve all had those moments (maybe you even had one today). It’s so frustrating when things that used to work break. Sometimes, you feel a bit silly. Other times, you’re ready to flip a table. Well, put that table back down!

Let unit testing save you from this nightmare. It’s a lot like coding with a safety net (or body armor if that’s how you roll). It lets you go a bit crazy while minimizing repercussions (as long as the police don’t show up).

You can read the companion article at: https://carlalexander.ca/introduction-wordpress-unit-testing

Carl Alexander

October 03, 2015
Tweet

More Decks by Carl Alexander

Other Decks in Programming

Transcript

  1. {
        "name":  "carlalexander/unit-­‐tested-­‐plugin",
        "type":

     "project",
        "description":  "A  unit  tested  WordPress  plugin",
        "homepage":  "https://carlalexander.ca",
        "license":  "GPL-­‐3.0+",
        "require":  {
                "php":  ">=5.3.0"
        },
        "require-­‐dev":  {
                "php-­‐mock/php-­‐mock-­‐phpunit":  "^0.3"
        }
 }
  2. {
        "name":  "carlalexander/unit-­‐tested-­‐plugin",
        "type":

     "project",
        "description":  "A  unit  tested  WordPress  plugin",
        "homepage":  "https://carlalexander.ca",
        "license":  "GPL-­‐3.0+",
        "require":  {
                "php":  ">=5.3.0"
        },
        "require-­‐dev":  {
                "php-­‐mock/php-­‐mock-­‐phpunit":  "^0.3"
        }
 }
  3. {
        "name":  "carlalexander/unit-­‐tested-­‐plugin",
        "type":

     "project",
        "description":  "A  unit  tested  WordPress  plugin",
        "homepage":  "https://carlalexander.ca",
        "license":  "GPL-­‐3.0+",
        "require":  {
                "php":  ">=5.3.0"
        },
        "require-­‐dev":  {
                "php-­‐mock/php-­‐mock-­‐phpunit":  "^0.3"
        }
 }
  4. $_tests_dir  =  getenv('WP_TESTS_DIR');
 if  (  !$_tests_dir  )  $_tests_dir  =  '/tmp/wordpress-­‐tests-­‐lib';


    
 require_once  $_tests_dir  .  '/includes/functions.php';
 
 function  _manually_load_plugin()  {
   require  dirname(  __FILE__  )  .  '/../unit-­‐tested-­‐plugin.php';
 }
 tests_add_filter(  'muplugins_loaded',  '_manually_load_plugin'  );
 
 require  $_tests_dir  .  '/includes/bootstrap.php';
  5. require_once(dirname(__DIR__)  .  '/vendor/autoload.php');
 
 $_tests_dir  =  getenv('WP_TESTS_DIR');
 if  (  !$_tests_dir

     )  $_tests_dir  =  '/tmp/wordpress-­‐tests-­‐lib';
 
 require_once  $_tests_dir  .  '/includes/functions.php';
 
 function  _manually_load_plugin()  {
   require  dirname(  __FILE__  )  .  '/../unit-­‐tested-­‐plugin.php';
 }
 tests_add_filter(  'muplugins_loaded',  '_manually_load_plugin'  );
 
 require  $_tests_dir  .  '/includes/bootstrap.php';
  6. namespace  UnitTestDemo;
 /**
  *  Get  a  plugin  option  from  the

     WordPress  database.
  *
  *  @param  string  $name
  *
  *  @return  mixed
  */
 function  demo_get_option($name)
 {
        return  get_option('demo_'  .  $name);
 }  
  7. namespace  UnitTestDemo;
 /**
  *  Get  a  plugin  option  from  the

     WordPress  database.
  *
  *  @param  string  $name
  *
  *  @return  mixed
  */
 function  demo_get_option($name)
 {
        return  get_option('demo_'  .  $name);
 }  
  8. namespace  UnitTestDemo;
 /**
  *  Get  a  plugin  option  from  the

     WordPress  database.
  *
  *  @param  string  $name
  *
  *  @return  mixed
  */
 function  demo_get_option($name)
 {
        return  get_option('demo_'  .  $name);
 }  
  9. class  DemoTest  extends  \PHPUnit_Framework_TestCase
 {
        public  function

     test_demo_get_option()
        {
                $this-­‐>assertEquals('bar',  demo_get_option('foo'));
        }   }
  10. class  DemoTest  extends  \PHPUnit_Framework_TestCase
 {
        public  function

     test_demo_get_option()
        {
                $this-­‐>assertEquals('bar',  demo_get_option('foo'));
        }   }
  11. class  DemoTest  extends  \PHPUnit_Framework_TestCase
 {
        public  function

     test_demo_get_option()
        {
                $this-­‐>assertEquals('bar',  demo_get_option('foo'));
        }   }
  12. class  DemoTest  extends  \PHPUnit_Framework_TestCase
 {
        public  function

     test_demo_get_option()
        {
                $this-­‐>assertEquals('bar',  demo_get_option('foo'));
        }   }
  13. class  DemoTest  extends  \PHPUnit_Framework_TestCase
 {
        public  function

     test_demo_get_option()
        {
                $this-­‐>assertEquals('bar',  demo_get_option('foo'));
        }   }
  14. class  DemoTest  extends  \PHPUnit_Framework_TestCase
 {
        public  function

     test_demo_get_option()
        {                  $get_option  =  $this-­‐>getFunctionMock(                          'UnitTestDemo',  'get_option'                  );   
                $this-­‐>assertEquals('bar',  demo_get_option('foo'));
        }   }
  15. class  DemoTest  extends  \PHPUnit_Framework_TestCase
 {
        public  function

     test_demo_get_option()
        {                  $get_option  =  $this-­‐>getFunctionMock(                          'UnitTestDemo',  'get_option'                  );
                $get_option-­‐>expects($this-­‐>once())
                                      -­‐>with($this-­‐>equalTo('demo_foo'))
                                      -­‐>willReturn('bar');   
                $this-­‐>assertEquals('bar',  demo_get_option('foo'));
        }   }
  16. class  DemoTest  extends  \PHPUnit_Framework_TestCase
 {
        public  function

     test_demo_get_option()
        {                  $get_option  =  $this-­‐>getFunctionMock(                          'UnitTestDemo',  'get_option'                  );
                $get_option-­‐>expects($this-­‐>once())
                                      -­‐>with($this-­‐>equalTo('demo_foo'))
                                      -­‐>willReturn('bar');   
                $this-­‐>assertEquals('bar',  demo_get_option('foo'));
        }   }
  17. class  DemoTest  extends  \PHPUnit_Framework_TestCase
 {
        public  function

     test_demo_get_option()
        {                  $get_option  =  $this-­‐>getFunctionMock(                          'UnitTestDemo',  'get_option'                  );
                $get_option-­‐>expects($this-­‐>once())
                                      -­‐>with($this-­‐>equalTo('demo_foo'))
                                      -­‐>willReturn('bar');   
                $this-­‐>assertEquals('bar',  demo_get_option('foo'));
        }   }
  18. class  DemoTest  extends  \PHPUnit_Framework_TestCase
 {
        public  function

     test_demo_get_option()
        {                  $get_option  =  $this-­‐>getFunctionMock(                          'UnitTestDemo',  'get_option'                  );
                $get_option-­‐>expects($this-­‐>once())
                                      -­‐>with($this-­‐>equalTo('demo_foo'))
                                      -­‐>willReturn('bar');   
                $this-­‐>assertEquals('bar',  demo_get_option('foo'));
        }   }
  19. namespace  UnitTestDemo;
 /**
  *  Get  a  plugin  option  from  the

     WordPress  database.
  *
  *  @param  string  $name
  *  @param  mixed    $default
  *
  *  @return  mixed
  */
 function  demo_get_option($name,  $default  =  null)
 {
        return  get_option('demo_'  .  $name,  $default);
 }  
  20. class  DemoTest  extends  \PHPUnit_Framework_TestCase
 {
        public  function

     test_demo_get_option()
        {                  $get_option  =  $this-­‐>getFunctionMock(                          'UnitTestDemo',  'get_option'                  );
                $get_option-­‐>expects($this-­‐>once())
                                      -­‐>with(                                                      $this-­‐>equalTo('demo_foo'),                                                      $this-­‐>identicalTo(null)                                        )
                                      -­‐>willReturn('bar');   
                $this-­‐>assertEquals('bar',  demo_get_option('foo'));
        }   }
  21. class  DemoTest  extends  \PHPUnit_Framework_TestCase
 {
        public  function

     test_demo_get_option_casts_array()
        {                  $get_option  =  $this-­‐>getFunctionMock(                          'UnitTestDemo',  'get_option'                  );
                $get_option-­‐>expects($this-­‐>once())
                                      -­‐>with(                                                      $this-­‐>equalTo('demo_foo'),                                                      $this-­‐>identicalTo(array())                                        )
                                      -­‐>willReturn('bar');   
                $this-­‐>assertEquals(
                        array('bar'),  demo_get_option('foo',  array())
                );
        }   }
  22. class  DemoTest  extends  \PHPUnit_Framework_TestCase
 {
        public  function

     test_demo_get_option_casts_array()
        {                  $get_option  =  $this-­‐>getFunctionMock(                          'UnitTestDemo',  'get_option'                  );
                $get_option-­‐>expects($this-­‐>once())
                                      -­‐>with(                                                      $this-­‐>equalTo('demo_foo'),                                                      $this-­‐>identicalTo(array())                                        )
                                      -­‐>willReturn('bar');   
                $this-­‐>assertEquals(
                        array('bar'),  demo_get_option('foo',  array())
                );
        }   }
  23. class  DemoTest  extends  \PHPUnit_Framework_TestCase
 {
        public  function

     test_demo_get_option_casts_array()
        {                  $get_option  =  $this-­‐>getFunctionMock(                          'UnitTestDemo',  'get_option'                  );
                $get_option-­‐>expects($this-­‐>once())
                                      -­‐>with(                                                      $this-­‐>equalTo('demo_foo'),                                                      $this-­‐>identicalTo(array())                                        )
                                      -­‐>willReturn('bar');   
                $this-­‐>assertEquals(
                        array('bar'),  demo_get_option('foo',  array())
                );
        }   }
  24. namespace  UnitTestDemo;
 
 /**
  *  Get  a  plugin  option  from

     the  WordPress  database.
  *
  *  @param  string  $name
  *  @param  mixed    $default
  *
  *  @return  mixed
  */
 function  demo_get_option($name,  $default  =  null)
 {
        $option  =  get_option('demo_'  .  $name,  $default);
 
        if  (is_array($default)  &&  !is_array($option))  {
                $option  =  (array)  $option;
        }
 
        return  $option;
 }