亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHPUnit測試私有屬性和方法功能示例

2024-05-05 00:04:08
字體:
來源:轉載
供稿:網友

本文實例講述了PHPUnit測試私有屬性和方法功能。分享給大家供大家參考,具體如下:

一、測試類中的私有方法:

class Sample{  private $a = 0;  private function run()  {    echo $a;  }}

上面只是簡單的寫了一個類包含,一個私有變量和一個私有方法。對于protected和private方法,由于無法像是用public方法一樣直接調用,所以在使用phpunit進行單測的時候,多有不便,特別是當一個類中,對外只提供少量接口,內部使用了大量private方法的情況。

對于protected方法,建議使用繼承的方式進行測試,在此就不再贅述。而對于private方法的測試,建議使用php的反射機制來進行。話不多說,上代碼:

class testSample(){    $method = new ReflectionMethod('Sample', 'run');    $method->setAccessible(true); //將run方法從private變成類似于public的權限    $method->invoke(new Sample()); //調用run方法}

如果run方法是靜態的,如:

private static function run(){  echo 'run is a private static function';}

那么invoke函數還可以這么寫:

$method->invoke(null); //只有靜態方法可以不必傳類的實例化

如果run還需要傳參,比如:

private function run($x, $y){  return $x + $y;}

那么,測試代碼可以改為:

$method->invokeArgs(new Sample(), array(1, 2));//array中依次寫入要傳的參數。執行結果返回3

【注意】:利用反射的方法測試私有方法雖好,但setAccessible函數是php5.3.2版本以后才支持的(>=5.3.2)

二、私有屬性的get/set

說完了私有方法,再來看看私有屬性,依舊拿Sample類作為例子,想要獲取或設置Sample類中的私有屬性$a的值可以用如下方法:

public function testPrivateProperty(){  $reflectedClass = new ReflectionClass('Sample');  $reflectedProperty = $reflectedClass->getProperty('a');  $reflectedProperty->setAccessible(true);  $reflectedProperty->getValue(); //獲取$a的值  $reflectedProperty->setValue(123); //給$a賦值:$a = 123;}

上述方法對靜態屬性依然有效。

到此,是不是瞬間感覺測試私有方法或屬性變得很容易了。

附:PHPunit 測試私有方法(英文原文)

This article is part of a series on testing untestable code:

  • Testing private methods
  • Testing code that uses singletons
  • Stubbing static methods
  • Stubbing hard-coded dependencies

No, not those privates. If you need help with those, this book might help.

One question I get over and over again when talking about Unit Testing is this:

"How do I test the private attributes and methods of my objects?"

Lets assume we have a class Foo:

<?phpclass Foo{  private $bar = 'baz';  public function doSomething()  {    return $this->bar = $this->doSomethingPrivate();  }  private function doSomethingPrivate()  {    return 'blah';  }}?>

Before we explore how protected and private attributes and methods can be tested directly, lets have a look at how they can be tested indirectly.

The following test calls the testDoSomething() method which in turn calls thedoSomethingPrivate() method:

<?phpclass FooTest extends PHPUnit_Framework_TestCase{  /**   * @covers Foo::doSomething   * @covers Foo::doSomethingPrivate   */  public function testDoSomething()  {    $foo = new Foo;    $this->assertEquals('blah', $foo->doSomething());  }}?>

The test above assumes that testDoSomething() only works correctly whentestDoSomethingPrivate() works correctly. This means that we have indirectly testedtestDoSomethingPrivate(). The problem with this approach is that when the test fails we do not know directly where the root cause for the failure is. It could be in eithertestDoSomething() or testDoSomethingPrivate(). This makes the test less valuable.

PHPUnit supports reading protected and private attributes through thePHPUnit_Framework_Assert::readAttribute() method. Convenience wrappers such asPHPUnit_Framework_TestCase::assertAttributeEquals() exist to express assertions onprotected and private attributes:

<?phpclass FooTest extends PHPUnit_Framework_TestCase{  public function testPrivateAttribute()  {    $this->assertAttributeEquals(     'baz', /* expected value */     'bar', /* attribute name */     new Foo /* object     */    );  }}?>

PHP 5.3.2 introduces the ReflectionMethod::setAccessible() method to allow the invocation of protected and private methods through the Reflection API:

<?phpclass FooTest extends PHPUnit_Framework_TestCase{  /**   * @covers Foo::doSomethingPrivate   */  public function testPrivateMethod()  {    $method = new ReflectionMethod(     'Foo', 'doSomethingPrivate'    );    $method->setAccessible(TRUE);    $this->assertEquals(     'blah', $method->invoke(new Foo)    );  }}?>

In the test above we directly test testDoSomethingPrivate(). When it fails we immediately know where to look for the root cause.

I agree with Dave Thomas and Andy Hunt, who write in their book "Pragmatic Unit Testing":

"In general, you don't want to break any encapsulation for the sake of testing (or as Mom used to say, "don't expose your privates!"). Most of the time, you should be able to test a class by exercising its public methods. If there is significant functionality that is hidden behind private or protected access, that might be a warning sign that there's another class in there struggling to get out."

So: Just because the testing of protected and private attributes and methods is possible does not mean that this is a "good thing".

參考文獻:

http://php.net/manual/en/class.reflectionmethod.php


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久久久久国产| 欧美激情视频在线免费观看 欧美视频免费一| 久久影视三级福利片| 日韩精品视频在线播放| 亚洲国产美女精品久久久久∴| www.亚洲免费视频| 亚洲免费视频网站| 亚洲精品一区在线观看香蕉| 亚洲午夜av电影| 欧美成人免费全部观看天天性色| 国产精品99一区| 国产视频精品在线| 国产日韩在线播放| 日韩av综合网| 久久精品亚洲一区| 国产精品亚洲激情| 久久成人国产精品| 亚洲精品少妇网址| 少妇激情综合网| 久久av资源网站| 亚洲国产91精品在线观看| 欧美成人精品激情在线观看| 国产美女精品视频免费观看| 日韩电影中文 亚洲精品乱码| 日韩av电影在线网| 亚洲美腿欧美激情另类| 在线日韩精品视频| 欧美裸体男粗大视频在线观看| 日韩不卡中文字幕| 亚洲人成电影在线播放| 中文字幕在线日韩| 午夜精品久久久久久久99热浪潮| 国产成+人+综合+亚洲欧洲| 日韩在线欧美在线| 性色av一区二区三区免费| 欧美裸体xxxx极品少妇| 国产精品视频网| 亚洲综合最新在线| 国产va免费精品高清在线| 一区二区三区 在线观看视| 欧美—级a级欧美特级ar全黄| 国产午夜精品全部视频在线播放| 国产成人亚洲综合| 日韩av在线最新| 亚洲精品免费在线视频| 欧美日韩午夜激情| 国产精品久久久久久久久久久新郎| 97香蕉超级碰碰久久免费的优势| 国产精品麻豆va在线播放| 日本伊人精品一区二区三区介绍| 欧美成在线观看| 欧美美女操人视频| 成人精品一区二区三区电影黑人| 国产精品7m视频| 亚洲欧美日韩天堂一区二区| 91视频国产精品| 国产日韩欧美中文| 国语自产精品视频在免费| 日韩成人激情影院| 久久久精品亚洲| 精品免费在线视频| 国产精品欧美久久久| 久久97精品久久久久久久不卡| 日韩有码片在线观看| 久久亚洲春色中文字幕| 欧美美女15p| 琪琪第一精品导航| 国产成人精品视| 九九热这里只有精品6| 91啪国产在线| 国产成人精品999| 欧美日韩高清在线观看| 精品国产欧美一区二区五十路| 中文字幕免费精品一区| 91亚洲一区精品| 日韩激情视频在线播放| 欧美日韩爱爱视频| 国产在线a不卡| 亚洲欧洲偷拍精品| 久久久久久国产| 91人人爽人人爽人人精88v| 国产69精品久久久久99| 日韩精品在线免费播放| 国产色综合天天综合网| 久久久免费在线观看| 精品久久久一区二区| 日韩欧美精品在线观看| 欧美视频专区一二在线观看| 欧美激情视频一区二区| 日韩成人久久久| 福利视频一区二区| 日韩电影中文字幕| 另类专区欧美制服同性| 国产成人福利网站| 亚洲国产毛片完整版| 88xx成人精品| 亚洲香蕉成视频在线观看| 自拍亚洲一区欧美另类| 国产在线999| 精品国产视频在线| 日韩中文在线中文网三级| 韩剧1988免费观看全集| 日韩激情av在线播放| 成人中心免费视频| 国产精品999| 日韩av日韩在线观看| 精品国产欧美一区二区五十路| 欧美日韩免费看| 亚洲激情成人网| 国产精品激情av在线播放| 亚洲国产精品成人av| 亚洲欧美精品中文字幕在线| 性金发美女69hd大尺寸| 国产成人在线亚洲欧美| 久久久久久久一区二区三区| 激情av一区二区| 精品免费在线观看| 久久久精品久久久久| 久久97精品久久久久久久不卡| 国产亚洲精品美女久久久久| 欧美丝袜美女中出在线| 久久久久久国产精品美女| 国产精品网址在线| 一区二区欧美激情| 欧美黑人极品猛少妇色xxxxx| 91大神福利视频在线| 久久久久久久久久久亚洲| 亚洲国内精品在线| 久久久精品国产| 日韩精品久久久久久福利| 久久精品中文字幕一区| 国产九九精品视频| 浅井舞香一区二区| 欧洲精品毛片网站| 九九久久久久99精品| 伊人久久五月天| 成人在线小视频| 亚洲视频在线免费看| 亚洲精品福利在线| 国产精品成人品| 久久久久久网站| 国产不卡av在线| 欧美黄色片免费观看| 精品中文字幕在线观看| 欧美视频在线观看 亚洲欧| 丰满岳妇乱一区二区三区| 在线看日韩欧美| 97在线视频免费观看| 中文字幕久热精品视频在线| 亚洲人成网站在线播| 亚洲va国产va天堂va久久| 日韩av影片在线观看| 2019中文字幕免费视频| 亚洲天堂精品在线| 在线色欧美三级视频| 久久五月情影视| 中文字幕亚洲天堂| 欧美激情久久久久| 91夜夜未满十八勿入爽爽影院| 久久大大胆人体| 亚洲免费一级电影| 欧美激情成人在线视频| 北条麻妃一区二区在线观看| 91在线观看免费高清完整版在线观看|