11/08/2018, 20:49

Mock static function trong PHP

Static function không phải là gì xa lạ đối với hầu hết các ngôn ngữ hiện đại. Trong PHP, static function hay được sử dụng với singleton pattern. Dưới đây là một ví dụ public class Book { /** * @return Book */ public static function Instance() { static $instance = ...

Static function không phải là gì xa lạ đối với hầu hết các ngôn ngữ hiện đại. Trong PHP, static function hay được sử dụng với singleton pattern. Dưới đây là một ví dụ

public class Book
{
    /**
     * @return Book
     */
    public static function Instance()
    {
        static $instance = null;
        if ($instance === null) {
            $instance = new Book();
        }
        return $instance;
    }

    /**
     * Private constructor
     */
    private function __construct()
    {
    }
}

Như vậy khi khởi tạo instance của class Book chúng ta có thể làm như sau:

$book1 = Book::Instance();
$book2 = Book::Instance();
var_dump($book1 === $book2);

Ở đây kết quả của $book1 === $book2 sẽ là True.

Để mock static function trong PHPUnit chúng ta sẽ cần dùng đến một hàm đặc biệt. Sebastian Bergmann, tác giả của PHPUnit đã viết một bài blog về PHPUnit và static function. Nói một cách tóm gọn thì ta có thể mocking như sau

$class::staticExpects($this->any())
              ->method('helper')
              ->will($this->returnValue('bar'));

Hàm staticExpects() đối với static function đơn giản có tác dụng giống hệt expects() đối với các function bình thường. Tuy nhiên staticExpects() chỉ chạy được với các static funtion mà class chủ thế chính là class được mock.

Nếu Class bạn muốn mock lại gọi 1 static function của 1 class khác , VD otherClass::anotherStaticMethod() thì xin chia buồn, class của bạn là không thể test được =D

0