PHP單元測(cè)試?yán)?PHPUNIT深入用法(三)
Phpunit中的Mocking
在介紹Mocking前,先來(lái)看下為什么要使用Mocking。舉一個(gè)數(shù)據(jù)庫(kù)查詢(xún)的例子,比如在某個(gè)應(yīng)用中,如果要測(cè)試一個(gè)數(shù)據(jù)庫(kù)的應(yīng)用,但假如這個(gè)數(shù)據(jù)庫(kù)的測(cè)試要耗費(fèi)很多資源以及編寫(xiě)很復(fù)雜的單元測(cè)試的代碼的話(huà),可以嘗試使用Mocking技術(shù)。舉例說(shuō)明如下:
<?php
class Database
{
public function reallyLongTime()
{
$results = array(
array(1,'test','foo value')
);
sleep(100);
return $results;
}
}
?>
在上面這個(gè)例子中,我們模擬了一個(gè)數(shù)據(jù)庫(kù)的操作,認(rèn)為它需要運(yùn)行很長(zhǎng)時(shí)間。接下來(lái)我們編寫(xiě)其單元測(cè)試代碼如下:
<?php
require_once '/path/to/Database.php';
class DatabaseTest extends PHPUnit_Framework_TestCase
{
private $db = null;
public function setUp()
{
$this->db = new Database();
}
public function tearDown()
{
unset($this->db);
}
/**
* Test that the "really long query" always returns values
*/
public function testReallyLongReturn()
{
$mock = $this->getMock('Database');
$result = array(
array(1,'foo','bar test')
);
$mock->expects($this->any())
->method('reallyLongTime')
->will($this->returnValue($result));
$return = $mock->reallyLongTime();
$this->assertGreaterThan(0,count($return));
}
}
?>
注意看這段代碼中有趣的地方,這里,使用了phpunit中的getMock對(duì)象方法,這里實(shí)際上是模擬生成一個(gè)Database類(lèi)的“偽實(shí)例”了,這里生成了$mock這個(gè)mock對(duì)象實(shí)例,以方便接著的單元測(cè)試中用到。接下來(lái)的這三行代碼:
$mock->expects($this->any())
->method('reallyLongTime')
->will($this->returnValue($result));
它們的含義為:無(wú)論方法reallyLongtime執(zhí)行了多長(zhǎng)時(shí)間,始終最后會(huì)直接返回$result這個(gè)數(shù)組的結(jié)果。這樣,你就可以通過(guò)mocking技術(shù)很輕易地去實(shí)現(xiàn)在單元測(cè)試中,繞過(guò)某些復(fù)雜的邏輯部分,而節(jié)省大量的寶貴時(shí)間提高測(cè)試效率。
下面的這個(gè)例子,講解的是Mocking技術(shù)中的更高級(jí)用法Mockbuilder。依然以上面的例子說(shuō)明:
<?php
public function testReallyLongRunBuilder()
{
$stub = $this->getMockBuilder('Database')
->setMethods(array(
'reallyLongTime'
))
->disableAutoload()
->disableOriginalConstructor()
->getMock();
$result = array(array(1,'foo','bar test'));
$stub->expects($this->any())
->method('reallyLongTime')
->will($this->returnValue($result));
$this->assertGreaterThan(0,count($return));
}
?>
通過(guò)使用Mockbuilder,我們可以不用通過(guò)構(gòu)造函數(shù)的方法去初始化一個(gè)mock對(duì)象。這段代碼跟上一段代碼的功能其實(shí)是一樣的,只不過(guò)留意一下新的兩個(gè)方法: disableAutoload和disableOriginalConstructor,其功能分別是禁止使用php的內(nèi)置的autoload初始構(gòu)造方法和禁止調(diào)用該類(lèi)原有的構(gòu)造函數(shù)。最后再看一個(gè)例子:
<?php
/**
* Testing enforcing the type to "array" like the "enforceTypes"
* method does via type hinting
*/
public function ttestReallyLongRunBuilderConstraint()
{
$stub = $this->getMock('Database',array('reallyLongTime'));
$stub->expects($this->any())
->method('reallyLongTime')
->with($this->isType('array'));
$arr = array('test');
$this->assertTrue($stub-> reallyLongTime ($arr));
}
?>
在這里,我們使用了with方法,其中這個(gè)方法中指定了要傳入的參數(shù)類(lèi)型為array數(shù)組類(lèi)型,最后這個(gè)斷言是通過(guò)了,因?yàn)榉祷氐牡拇_是數(shù)組類(lèi)型。
更多的關(guān)于phpunit中mock的用法,請(qǐng)參考phpunit手冊(cè)中第11章的論述。
- Windows下安裝PHP單元測(cè)試環(huán)境PHPUnit圖文教程
- PHP單元測(cè)試?yán)?PHPUNIT初探
- PHP單元測(cè)試?yán)?PHPUNIT深入用法(二)
- PHP單元測(cè)試PHPUnit簡(jiǎn)單用法示例
- PHP單元測(cè)試框架PHPUnit用法詳解
- 使用PHPUnit進(jìn)行單元測(cè)試并生成代碼覆蓋率報(bào)告的方法
- php單元測(cè)試phpunit入門(mén)實(shí)例教程
- PHP使用phpunit進(jìn)行單元測(cè)試示例
- PHPUnit + Laravel單元測(cè)試常用技能
- Windows下wamp php單元測(cè)試工具PHPUnit安裝及生成日志文件配置方法
- laravel單元測(cè)試之phpUnit中old()函數(shù)報(bào)錯(cuò)解決
- PHPUnit 單元測(cè)試安裝與使用入門(mén)教程
相關(guān)文章
一個(gè)簡(jiǎn)單至極的PHP緩存類(lèi)代碼
這篇文章和大家分享了一個(gè)簡(jiǎn)單至極的PHP緩存類(lèi)代碼,緩存的應(yīng)用對(duì)于php項(xiàng)目的開(kāi)發(fā)來(lái)說(shuō)尤為重要,需要的朋友可以參考下2015-10-10
php使用高斯算法實(shí)現(xiàn)圖片的模糊處理功能示例
這篇文章主要介紹了php使用高斯算法實(shí)現(xiàn)圖片的模糊處理功能,結(jié)合實(shí)例形式分析了php圖形處理的相關(guān)操作技巧,需要的朋友可以參考下2016-11-11
兩級(jí)聯(lián)動(dòng)select刷新后其值保持不變的實(shí)現(xiàn)方法
兩級(jí)聯(lián)動(dòng)select刷新后,select值保持不變即點(diǎn)擊提交按鈕后,頁(yè)面select中繼續(xù)維持提交前的值,下面有個(gè)不錯(cuò)的示例,大家可以參考下2014-01-01
php include,include_once,require,require_once
其實(shí)PHP包含文件的這四個(gè)函數(shù),很多人還是沒(méi)完全明白的,雖然用的時(shí)候多,但是具體某些地方該怎么用,用那一個(gè),我就獻(xiàn)丑一把.2008-09-09
PHP圖片處理之圖片旋轉(zhuǎn)和圖片翻轉(zhuǎn)實(shí)例
這篇文章主要介紹了PHP圖片處理之圖片旋轉(zhuǎn)和圖片翻轉(zhuǎn)實(shí)例,本文使用imagerotate函數(shù)實(shí)現(xiàn),自定義了多個(gè)函數(shù)來(lái)實(shí)現(xiàn)功能需求,需要的朋友可以參考下2014-11-11
關(guān)于zend studio 出現(xiàn)亂碼問(wèn)題的總結(jié)
本篇文章是對(duì)zend studio出現(xiàn)亂碼問(wèn)題進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友參考下2013-06-06
PHP自定session保存路徑及刪除、注銷(xiāo)與寫(xiě)入的方法
這篇文章主要介紹了PHP自定session保存路徑及刪除、注銷(xiāo)與寫(xiě)入的方法,以實(shí)例形式詳細(xì)講述了session的常用操作技巧,在進(jìn)行PHP項(xiàng)目開(kāi)發(fā)的時(shí)候有很好的借鑒價(jià)值,需要的朋友可以參考下2014-11-11
PHP使用puppeteer抓取JS渲染后的頁(yè)面內(nèi)容
最近遇到一個(gè)問(wèn)題,需要爬取js渲染后的網(wǎng)頁(yè)內(nèi)容,因此研究了下相關(guān)實(shí)現(xiàn)方式,主要借助puppeteer實(shí)現(xiàn),它是一個(gè)Node庫(kù),要想在PHP中使用,還借助了spatie/browsershot2025-02-02

