Tips: WordPress Unit Test
เนื่องจากที่ Pronto Tools เรามี Product ที่ใช้ WordPress Platform ด้วย Product ตัวนี้ของเราค่อนข้างใหญ่และมี custom plugins เยอะมาก เรียกได้ว่าใครที่อยากมีประสบการณ์กับ WordPress, PHP ถ้าได้มาทำงานที่นี่คือได้ครบ และ code เหล่านี้ก็มีการเขียน unit test ด้วย blog นี้เลยอยากแชร์ trick บางอย่างที่พวกเราใช้ ส่วน tutorial นี่หาอ่านได้ทั่วไปเลยจ้ะ เช่น site ของ Juan Treminio เค้าเขียนให้อ่านตั้ง 5 part แล้วก็มีของเว็บ wpmudev
blog นี้จะอธิบายเหมือน take note กันลืมมากๆ เลยนะ ฮาๆ
สมมตินี่คือ class ของเรา ก็จะค่อยๆ เติมของเข้ามา
class TestProntoAPI extends WP_UnitTestCase {
....
....
}
การใช้ dbDelta
function setUp(){
parent::setUp();
$sql = 'CREATE TABLE ...';
dbDelta($sql)
}
การใช้ Factory
ที่ใช้กันบ่อยๆ เลยก็จะเป็น post object ก็จะทำประมาณนี้
function _create_post () {
$post_id = $this->factory->post->create( array (
'post_type' => 'post',
'post_status' => 'publish',
'post_content' => '',
'post_title' => 'Test Blog feed'
));
return $post_id;
}
อันนึงที่มีประโยชน์มากสำหรับการ test multisite คือ blog factory หาตัวอย่างคนทำไม่ค่อยได้ด้วย สามารถใส่ parameter เข้าไปได้ด้วย เช่น domain อยากรู้ว่าใส่ parameter อะไรได้อีกก็ ดูที่นี่
$blog_id = $this->factory->blog->create(
'domain' => 'example.org'
)
ถ้าอยากดูตัวอย่าง factory ว่ามีอะไรที่ WordPress ให้ใช้บ้าง ดูที่นี่
อย่าลืมว่าวิธีการรันเทสของ single site และ multisite ไม่เหมือนกัน และถ้าเรารัน test แบบ single site เราจะไม่สามารถใช้คำสั่งของ multisite ได้เลย เช่นพวก switch_to_blog()
หรือ wp_get_sites()
คำสั่งรัน PHP single site phpunit
คำสั่งรัน PHP multisite phpunit -c yourpath/tests/phpunit/multisite.xml
ในนี้มีตัวอย่าง multisite test ให้ดูอีกนิดหน่อย ดูที่นี่
ทำยังงัยถ้าเราจะ mock สิ่งที่รับมาจาก $_POST
$_REQUEST
คำถามนี้ถ้าคิดลึกจะโคตรยาก แต่ถ้าคิดตื้นๆ จะง่ายมาก สมมติเรามี function นี้ ซึ่งมีการรับค่ามา $apple
เข้ามาทาง $_REQUEST
function get_apple(){
extract( $_REQUEST );
$text = "You know? I'm {$apple}";
return $text;
เวลาเขียน test ก็แบบนี้เลย
function test_get_apple(){
$_REQUEST['apple'] = 'apple';
$result = get_apple();
$this->assertEquals("You know? I'm apple", $result);
}
สามารถ activate plugin ตอน test ได้ด้วย อ่านเกี่ยวกับการ test plugin activate ได้ ที่นี่
$plugin = activate_plugin( WP_PLUGIN_DIR . '/akismet/akismet.php' );
ดูเพิ่มเติมได้ ที่นี่ ถ้าอยากรู้ว่าเรา Assert อะไรได้บ้าง
search ไปๆ มาๆ ไปเจอกันทำ wp scaffold plugin-tests ดูน่าสนใจมาก น่าจะทำให้ชีวิตการ install ง่ายขึ้น เพราะจริงๆ การ set environment ของการรัน phpunit ค่อนข้างลำบาก ยังไม่เคยลองเหมือนกัน