在上面的例子中,這種手段創(chuàng)建了一個(gè)名為MockAccumulator的類(lèi)來(lái)響應(yīng)所有Accumulator類(lèi)的方法。另外,偽累加的動(dòng)作還有其他手段來(lái)操作偽對(duì)象自身的實(shí)例。例如 setReturnValue()。給出一個(gè)方法名和一個(gè)值,
setReturnValue()就可以改變偽對(duì)象而給出對(duì)應(yīng)方法所調(diào)用的值。因此,這條語(yǔ)句$amount->setReturnValue(‘total’, 200)返回200而不論何時(shí)調(diào)用了total()方法。
一旦進(jìn)行完初始化工作后,你可以傳遞MockAccumulator類(lèi)到calc_tax()函數(shù)來(lái)演示一個(gè)在真實(shí)的Accumulator對(duì)象空間中的動(dòng)作。
如果你止步于此——即用一個(gè)對(duì)象來(lái)返回所調(diào)用函數(shù)的“封裝”響應(yīng)——你只是使用了ServerStub模式。 用偽對(duì)象來(lái)驗(yàn)證方法的調(diào)用不限于此,因?yàn)樗梢圆幌薮涡蚺c次數(shù)。
下面是一個(gè)通過(guò)對(duì)象來(lái)驗(yàn)證“數(shù)據(jù)流”的例子:
class MockObjectTestCase extends UnitTestCase { // ... function testCalcTax() { $amount =& new MockAccumulator($this); $amount->setReturnValue(‘total’,200); $amount->expectOnce(‘total’); $this->assertEqual( 14, calc_tax($amount)); $amount->tally(); } }
這里expectOnce()方法使用了一個(gè)字符串,它包含你想調(diào)用的方法名 。而tally()實(shí)際上用來(lái)檢查你的想法是否實(shí)現(xiàn)。這里,如果MockAccumulator::total()只調(diào)用一次或不調(diào)用,測(cè)試將失敗。
在很多情況下你可以使用偽對(duì)象的”跟蹤”特性。例如,如果你傳遞一個(gè)具有三個(gè)值的數(shù)組到calc_total(),Accumulator::add()是否也如你所想的調(diào)用了三次呢?
class MockObjectTestCase extends UnitTestCase { // ... function testCalcTotalAgain() { $sum =& new MockAccumulator($this); $sum->expectOnce(‘a(chǎn)dd’); calc_total(array(1,2,3), $sum); $sum->tally(); } }
那,這里發(fā)生了什么?傳遞調(diào)用的測(cè)試失敗。SimpleTest的錯(cuò)誤消息如下所示:
MockObject PHP4 Unit Test 1) Expected call count for [add] was [1] got [3] at line [51] in testcalctotalagain in mockobjecttestcase FAILURES!!! Test cases run: 1/1, Passes: 2, Failures: 1, Exceptions: 0
錯(cuò)誤消息指出了盡管add() 方法被調(diào)用三次,但expectOnce()卻一次也沒(méi)用到。取代expectOnce()的可行方法是使用expectCallCount()。
class MockObjectTestCase extends UnitTestCase { // ... function testCalcTotalAgain() { $sum =& new MockAccumulator($this); $sum->expectCallCount(‘a(chǎn)dd’, 3); calc_total(array(1,2,3), $sum); $sum->tally(); } }
偽對(duì)象扮演了一個(gè)演員的角色——這個(gè)角色由SeverStub提供合理的測(cè)試數(shù)據(jù)來(lái)響應(yīng)方法的調(diào)用——并且作為一個(gè)評(píng)判的角色,驗(yàn)證所調(diào)用的方法是否符合預(yù)想。
出處:phpchina
責(zé)任編輯:bluehearts
上一頁(yè) php設(shè)計(jì)模式介紹之偽對(duì)象模式 [1] 下一頁(yè) php設(shè)計(jì)模式介紹之偽對(duì)象模式 [3]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|