phpunit with mock

Concept ของ phpunit คือเทสอะไรที่มันเป็นแค่ logic ใช้เวลาแค่เสี้ยววินาที
สมมติว่าเรามี Class ที่มีการต่อ External Service หรือ Database อยู่ซึ่งมันไม่เที่ยงตรงและช้า เราจะต้องใช้ mock มาช่วยในเรื่องนี้

class UnitTrueConnectAPIDevTest extends PHPUnit_Framework_TestCase
{
      public ExampleTest(){
        $returnValidateApplication = '{"app_id":"29","secret":"bb3e12c591be11543ab76606f2f4d089","name":"trueid","description":"trueid","type":"web","group_id":"1","verified_time":"0"}';
       
        $this->external['ProfileMongoExternal'] = $this->getMock('ProfileMongoExternal',array('add','update'));
       
        $this->external['ProfileMongoExternal']->expects($this->any())
            ->method('add')
            ->will($this->returnValue('1'));
        $this->external['ProfileMongoExternal']->expects($this->any())
            ->method('update')
            ->will($this->returnValue('1'));  
 
        $mock = $this->getMock('TrueConnectAPI'
                                ,array('validateApplication')
                                ,array('store' => $this->store, 'external' => $this->external));
       
        $mock->expects($this->any())
            ->method('validateApplication')
            ->will($this->returnValue(json_decode($returnValidateApplication,true)));

        $response = @$mock->register();
       }
}

จากตัวอย่างจะทำการ mock class ProfileMongoExternal ให้ method add และ update ถ้ามีการเรียกใช้งานใน class TrueConnectAPI
จะได้ค่า return เป็น “1″ ออกมาเลยซึ่งความจริงมันจะต้อง curl ออกไปด้านนอก

ส่วน mock class TrueConnectAPI ในตัวอย่างนี้จะให้ method validateApplication return Array ออกมาเลย ซึ่งความจริงมันจะต้องไปต่อ Database

โดยใน class TrueConnectAPI ที่ constructor จะต้อง handle ค่า mock ที่จะโยนเข้าไปใช้งานด้วย ถ้าจะมีการทำ phpunit ซึ่งควรทำก่อน develop code อยู่แล้ว ก็จะได้ design class ไปด้วย แต่ถ้าใครมาทำทีหลังก็วุ่นหน่อยครับ เพราะต้องแก้ไขโค้ดกันเยอะ

อธิบายคำสั่ง mock

$this->expects($this->any())

หมายความว่า คาดหวังให้ทำการ mock ทุกครั้งที่มีการเรียก method ดังกล่าว

$this->expects($this->at(0))

ถ้าแบบนี้หมายความว่า ถ้าเรียก method นั้นครั้งที่ 1 จะได้ผลลัพธ์ตามที่เราใส่ไว้ ใช้ในกรณีที่ มีการเรียก method อันเดิมหลายๆครั้ง แต่ต้องการให้ response return ออกมาต่างๆกัน

$this->returnValue($response)

ใช้ในการกำหนด return ของ mock method ที่เราต้องการให้เป็นซึ่งค่าเป็นได้ทุกชนิดเช่น Array,String,Int,Std Object

Related posts:

This entry was posted in knowledge, php. Bookmark the permalink.