為了讓測試運行得更快更可靠,寫測試更方便,人們通常使用Mock,而不是直接使用真正的外部依賴 最近,Facebook寫了一個新的PHP Mock工具,用它寫的Mock看上去非常干淨整潔。 當使用PHP其它的Mock框架時,寫的代碼需要更多的語句,而且令測試過於依賴具體的實現細節。 比如,當我們用PHPUnit做Mock,只是簡單地返回一些值時,代碼可能象下面這樣 [php] <pre name="code" class="php">$user = $this->getMock('User') ->expects($this->any()) ->method('getID') ->will($this->returnValue(1234); </pre><br> <pre></pre> 而使用FBMock時,代碼如下: [php] $user = mock('User')->mockReturn('getID', 1234); 其實,FBMock並不是真正意義上的Mock框架,因為它沒有上面代碼那樣,使用期望值檢查。所以,只能算是一個有spy功能的樁。其實,Mock框架中的這種期望值檢查最好少用,因為它有點兒過於限定化了。上面用FBMock的例子中,其實並不在意getID()被調用了多少次。 當然,有的時候檢查哪個method被調用過也是很重要的,這時候可以簡單地依賴於PHPUnit中的assertion。 [php] $logger = mock('Logger'); // Run code that uses $logger // Make sure 'data' was logged $this->assertCalledOnce($logger, 'log', array('data')); 目前,FBMock支持 Zend PHP 5.4+ 和 HipHop VM。