当前位置: 主页 > 编程知识 > Php编程 > 全面介绍php设计模式之伪对象模式

全面介绍php设计模式之伪对象模式

时间:2010-1-25来源:站长资讯网 点击:

在上面的例子中,这种手段创建了一个名为MockAccumulator的类来响应所有Accumulator类的方法。另外,伪累加的动作还有其他手段来操作伪对象自身的实例。例如 setReturnValue()。给出一个方法名和一个值,

setReturnValue()就可以改变伪对象而给出对应方法所调用的值。因此,这条语句$amount->setReturnValue(‘total’, 200)返回200而不论何时调用了total()方法。

一旦进行完初始化工作后,你可以传递MockAccumulator类到calc_tax()函数来演示一个在真实的Accumulator对象空间中的动作。

如果你止步于此——即用一个对象来返回所调用函数的“封装”响应——你只是使用了ServerStub模式。 用伪对象来验证方法的调用不限于此,因为它可以不限次序与次数。

下面是一个通过对象来验证“数据流”的例子:

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()方法使用了一个字符串,它包含你想调用的方法名 。而tally()实际上用来检查你的想法是否实现。这里,如果MockAccumulator::total()只调用一次或不调用,测试将失败。

在很多情况下你可以使用伪对象的”跟踪”特性。例如,如果你传递一个具有三个值的数组到calc_total(),Accumulator::add()是否也如你所想的调用了三次呢?

class MockObjectTestCase extends UnitTestCase {

// ...

function testCalcTotalAgain() {

$sum =& new MockAccumulator($this);

$sum->expectOnce(‘add’);

calc_total(array(1,2,3), $sum);

$sum->tally();

}

}

那,这里发生了什么?传递调用的测试失败。SimpleTest的错误消息如下所示:

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

错误消息指出了尽管add() 方法被调用三次,但expectOnce()却一次也没用到。取代expectOnce()的可行方法是使用expectCallCount()。

class MockObjectTestCase extends UnitTestCase {

// ...

function testCalcTotalAgain() {

$sum =& new MockAccumulator($this);

$sum->expectCallCount(‘add’, 3);

calc_total(array(1,2,3), $sum);

$sum->tally();

}

}

伪对象扮演了一个演员的角色——这个角色由SeverStub提供合理的测试数据来响应方法的调用——并且作为一个评判的角色,验证所调用的方法是否符合预想。

站长资讯网
.
分页: [1] [2] [3] [4] [5] [6] [7]
TAG: php 伪对象模式
推荐内容最近更新人气排行
关于我们 | 友情链接 | 网址推荐 | 常用资讯 | 网站地图 | RSS | 留言