最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP單元測試利器 PHPUNIT深入用法(三)

 更新時間:2011年03月06日 21:48:19   作者:  
在本系列文章的前兩篇中PHP單元測試利器:PHPUNIT初探和PHP單元測試利器:PHPUNIT深入用法(二)中,分別介紹了phpunit的基本用法和phpunit中的一些重要用法。

Phpunit中的Mocking

  在介紹Mocking前,先來看下為什么要使用Mocking。舉一個數(shù)據(jù)庫查詢的例子,比如在某個應用中,如果要測試一個數(shù)據(jù)庫的應用,但假如這個數(shù)據(jù)庫的測試要耗費很多資源以及編寫很復雜的單元測試的代碼的話,可以嘗試使用Mocking技術。舉例說明如下:

 

<?php
class Database
{
public function reallyLongTime()
{
$results = array(
array(1,'test','foo value')
);
sleep(100);
return $results;
}
}
?>

 

   在上面這個例子中,我們模擬了一個數(shù)據(jù)庫的操作,認為它需要運行很長時間。接下來我們編寫其單元測試代碼如下:

 

<?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對象方法,這里實際上是模擬生成一個Database類的“偽實例”了,這里生成了$mock這個mock對象實例,以方便接著的單元測試中用到。接下來的這三行代碼:

 

$mock->expects($this->any())
->method('reallyLongTime')
->will($this->returnValue($result));

 

   它們的含義為:無論方法reallyLongtime執(zhí)行了多長時間,始終最后會直接返回$result這個數(shù)組的結果。這樣,你就可以通過mocking技術很輕易地去實現(xiàn)在單元測試中,繞過某些復雜的邏輯部分,而節(jié)省大量的寶貴時間提高測試效率。

  下面的這個例子,講解的是Mocking技術中的更高級用法Mockbuilder。依然以上面的例子說明:

 

<?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));
}
?>

 

   通過使用Mockbuilder,我們可以不用通過構造函數(shù)的方法去初始化一個mock對象。這段代碼跟上一段代碼的功能其實是一樣的,只不過留意一下新的兩個方法: disableAutoload和disableOriginalConstructor,其功能分別是禁止使用php的內(nèi)置的autoload初始構造方法和禁止調(diào)用該類原有的構造函數(shù)。最后再看一個例子:

 

<?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方法,其中這個方法中指定了要傳入的參數(shù)類型為array數(shù)組類型,最后這個斷言是通過了,因為返回的的確是數(shù)組類型。

  更多的關于phpunit中mock的用法,請參考phpunit手冊中第11章的論述。

相關文章

最新評論

勐海县| 新津县| 大洼县| 东乌珠穆沁旗| 婺源县| 锡林郭勒盟| 库尔勒市| 尚志市| 德清县| 丹阳市| 古蔺县| 亚东县| 敦化市| 潜山县| 丰县| 滕州市| 西林县| 渭南市| 中牟县| 崇左市| 防城港市| 平度市| 革吉县| 五大连池市| 辰溪县| 旌德县| 宿迁市| 高要市| 九江县| 八宿县| 积石山| 龙游县| 晋江市| 清流县| 专栏| 陇西县| 吉木萨尔县| 从江县| 沂水县| 哈尔滨市| 宁海县|