关闭顶部展开顶部

谈php设计模式介绍——伪对象模式(5)_PHP教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:解析php字符串处理函数
addcslashes 为字符串里面的部分字符添加反斜线转义字符 addslashes 用指定的方式对字符串里面的字符进行转义 bin2hex 将二进制数据转换成十六进制表示 chr 返回一个字符的ASCII码 chunk_split 按一定的字符长度将字符串分割成小块 convert_cyr_string 将斯

现在让我们来创建一些测试的实例来详细说明重构后的运用程序应该有的功能。

require_once ‘simpletest/unit_tester.php’;

require_once ‘simpletest/reporter.php’; require_once ‘simpletest/mock_objects.php’; require_once ‘simpletest/web_tester.php’;

require_once ‘classes.inc.php’; Session::init();

class PageWebTestCase extends WebTestCase { /*...*/ } class ResponseTestCase extends UnitTestCase { /*...*/ } class UserLoginTestCase extends UnitTestCase { /*...*/ } class SessionTestCase extends UnitTestCase { /*...*/ }

class PageDirectorTestCase extends UnitTestCase { /*...*/ }

$test = new GroupTest(‘Application PHP4 Unit Test’);

$test->addTestCase(new PageWebTestCase);

$test->addTestCase(new ResponseTestCase);

$test->addTestCase(new UserLoginTestCase);

$test->addTestCase(new SessionTestCase);

$test->addTestCase(new PageDirectorTestCase);

这段代码或多或少的展示了一个典型的运用程序的测试文件该是何种模样。它一开始就包含了一些SimpleTest文件,也包括了用伪对象来测试的mock_object.php文件。接着,那些辅助类被包含进来,方法Session::init()被调用,seesion开始。

紧接着的全是以“安全无害”为目标而开始的测试实例,类WebTestCase确保所有程序按要求执行, 然后是单独的用于新设计的类的测试(尽管这种类本章不会详述)。最后是我们接下去会讨论的PageDirectorTestCase类。

类PageDirector的核心任务是协调类Session和类Response的对象,产生最终的网页输出结果。

Mock::Generate(‘Session’);

Mock::Generate(‘Response’);

define(‘SELF’, ‘testvalue’);

class PageDirectorTestCase extends UnitTestCase {

// ...

}

在这段代码的一开始,Mock::generate()创建了伪对象类的定义并定义了一个后面将要用到的常量。

假设对类Session 和类 Response的测试已经存在,下一步就是创建伪Session来模拟类 Session的状态。这个伪对象的设置和我们一开始所演示的例子极其类似。

因为PageDirector::run()方法正回显内容,你可以用输出缓存内容的办法来捕获它,看看是否正确。

class PageDirectorTestCase extends UnitTestCase {

// ...

function TestLoggedOutContent() {

$session =& new MockSession($this);

$session->setReturnValue(‘get’, null, array(‘user_name’));

$session->expectOnce(‘get’, array(‘user_name’));

$page =& new PageDirector($session, new Response);

ob_start();

$page->run();

$result = ob_get_clean();

$this->assertNoUnwantedPattern(‘/secret.*content/i’, $result);

$this->assertWantedPattern(‘/<form.*<input[^>]*text[^>]*’

.’name.*<input[^>]*password[^>]*passwd/ims’

,$result);

$session->tally();

}

}

这段代码证明了在SimpleTest中使用伪对象的必要性。我们来看看其中创建伪对象的一行代码$session =&new MockSession($this)。你可以使用继承自SimpleStub类(参见http://simpletest.sf.net/SimpleTest/MockObjects/SimpleStub.html#sec-methodsummary)的方法来创建你所希望的从对象(如同你在测试代码时所做的那样)返回的结果.下一步,实例化PageDirector类并用MockSession代替正式使用时的类来实例化相关代码。

注:setReturnValue()方法

setReturnValue()方法通过指定当伪对象的特定方法被调用时返回何值来让伪对象以一个“替身”的身份融入代码。已经有了一些这种方法的变体:比如指定以一定次序返回一系列值的做法,还有以参数代替值来返回结果的做法。

expectOnce()方法

expectOnce()方法通过建立一些假想,这些假想是关于什么时候方法被调用以及多久调用一次,来允许你的伪对象以“批评者”的角色来测试代码。这些假想当你在测试中调用伪对象的tally()方法时会被报告。

class PageDirector {

var $session;

var $response;

function PageDirector(&$session, &$response) {

$this->session =& $session;

$this->response =& $response;

}

}

因为PageDirector类认为自己不是处于一个测试环境而是处于一个真实正常的运用程序环境中,它回显结果到浏览器。既然你实际上在测试时并不希望这个动作,你就可以通过PHP输出缓存的特性(参见http://php.net/outcontrol)来捕获执行时它往浏览器发送了什么。

class PageDirector {

// ...

function run() {

if (!$this->isLoggedIn()) {

$this->showLogin();

}

$this->response->display();

}

function isLoggedIn() {

return ($this->session->get(‘user_name’)) ? true : false;

}

function showLogin() {

$this->response->addBody(‘<form method=”post”>’);

$this->response->addBody(‘Name:<input type=”text” name=”name”>’);

$this->response->addBody(“\n”);

$this->response->addBody(

‘Password:<input type=”password” name=”passwd”>’);

$this->response->addBody(“\n”);

$this->response->addBody(‘<input type=”submit” value=”Login”>’);

$this->response->addBody(‘</form>’);

}

}

如同这段程序代码一样,测试代码本身也可以进行重构。在本例中,你可以看到缓存输出的诀窍是其将被多次复用,因此使用“析构法”重构可以使测试本身简化。(重新调用的那些以“test”为开头的方法是随整个测试一起自动运行的;你也可以自己创建一些使测试更简洁的方法。)

分享:怎样把握技巧开发PHP网站
1.使用 ip2long() 和 long2ip() 函数来把 IP 地址转化成整型存储到数据库里。这种方法把存储空间降到了接近四分之一(char(15) 的 15 个字节对整形的 4 个字节),计算一个特定的地址是不是在一个区段内页更简单了,而且加快了搜索和排序的速度(虽然有时仅

来源:模板无忧//所属分类:PHP教程/更新时间:2009-06-20
相关PHP教程
闂佹眹鍩勯崹閬嶆偤閺囶澁缍栭柛鈩冪⊕閳锋帗銇勯弴妤€浜惧銈忕秶閹凤拷
濠电偛顕慨顓㈠磻閹炬枼妲堥柡鍌濇硶婢ф稒淇婇懠顒夆偓婵嬫煟閵忊晛鐏查柟鍑ゆ嫹
濠电姷顣介埀顒€鍟块埀顒勵棑缁辩偛顓兼径瀣閻庣懓瀚竟鍡欐崲娑斾線鏌i姀鈺佺伈闁瑰嚖鎷�
濠电姷顣介埀顒€鍟块埀顒勵棑缁辩偛顓兼径濠勵吋闂佽鍨庨崟顓фК闂佽閰eḿ褍螞濞戙垺鍋夐柨鐕傛嫹
闂備胶枪缁绘劙骞婃惔銊ョ劦妞ゆ帒鍊哥敮鍫曞箹鐎涙ḿ鐭掔€规洘绻堥弫鎾绘晸閿燂拷
闂備胶枪缁绘劙骞婃惔銊ョ劦妞ゆ巻鍋撻柛姘儑缁﹪鏁傞崜褏鐓撻柣搴岛閺呮繈鎯屽▎鎴犵=濞撴艾锕ョ€氾拷
闂備浇銆€閸嬫挻銇勯弽銊р槈闁伙富鍣i弻娑樷攽閹邦亞鑳虹紓浣靛妽濡炶棄顕i妸鈺婃晬婵炲棙鍨电粭锟犳⒑閸濆嫬鈧骞婇幘鑸殿潟闁跨噦鎷�
闂備礁鎼崯鐗堟叏妞嬪海绀婂鑸靛姈閻擄綁鎮规潪鎷岊劅婵炲眰鍊曢湁闁挎繂妫欑粈鈧梺鍛娚戦悧鐘茬暦閹扮増鏅搁柨鐕傛嫹
婵犵妲呴崹顏堝礈濠靛棭鐔嗘俊顖氬悑鐎氱粯銇勯幘瀵哥畺閻庢熬鎷�
濠电姷顣介埀顒€鍟块埀顒勵棑缁辩偛顓奸崶銊ヮ伕濡炪倖鎸荤换鍐偓姘虫珪娣囧﹪顢涘Δ鈧晶鍙夌節椤喗瀚�
婵犵妲呴崹顏堝礈濠靛棭鐔嗘慨妞诲亾鐎规洦鍓熼、娆撳礂閻撳簶鍋撻悽鍛婄厸闁割偅绻勫瓭婵犳鍣幏锟�
婵犵妲呴崹顏堝礈濠靛棭鐔嗘慨妞诲亾闁哄苯鎳橀崺鈧い鎺嗗亾闁宠閰i獮鎴﹀箛闂堟稒顔嗛梻浣告惈鐎氭悂骞忛敓锟�
婵犵妲呴崹顏堝礈濠靛棭鐔嗘慨妞诲亾鐎规洩缍侀獮瀣攽閸偂绱�
濠电姷顣介埀顒€鍟块埀顒勵棑缁辩偛顓兼径濠勭厬闂佺懓鐡ㄧ换鍕敂鐎涙ü绻嗘い鏍殔婢у弶绻濋~顔藉
闂佽楠搁崢婊堝礈濠靛鍋嬮柟鎯版閻鈹戦悩鎻掓殭闁奸潧缍婇弻銈夋嚍閵夈儱顫嶉梺缁樼壄缂嶄礁鐣峰▎鎾存櫢闁跨噦鎷�
UB闂備礁婀辩划顖炲礉濡ゅ懐宓侀柛銉㈡櫆鐎氭岸鎮楀☉娅虫垿锝為敓锟�
闂備浇澹堟ご绋款潖婵犳碍鐒鹃悗鐢电《閸嬫捇鐛崹顔句痪濠电姭鍋撻柨鐕傛嫹
闂佽楠哥粻宥夊垂閸濆嫸鑰块柛銏㈠殰
闂備礁鎲″缁樻叏妞嬪海绀婂璺虹灱閸楁碍绻涢崱妤€顒㈤柛鐐差槹缁绘稓绱欓悩鍝勫帯闂佺ǹ楠忛幏锟�
缂傚倸鍊烽悞锕傛偡閿曞倸鍨傛繝濠傚椤╅攱銇勯幒宥囶槮缂佹彃婀遍埀顒傚仯閸婃繄绱撳棰濇晩闁跨噦鎷�
©2017 www.mb5u.com婵犵妲呴崹顏堝礈濠靛棭鐔嗘慨妞诲亾鐎殿噮鍣i幃鈺呭箵閹烘挸鐦�
闂備浇銆€閸嬫捇鏌熼婊冾暭妞ゃ儻鎷�&闂備礁鎲$敮鎺懳涢弮鍫燁棅闁跨噦鎷�