婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PHPUnit測試私有屬性和方法功能示例

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

熱門標簽:智能外呼電銷系統 寶安400電話辦理 電銷機器人-快迭智能 合肥外呼系統app 哈爾濱400電話辦理到易號網 拉薩打電話機器人 沈陽人工智能電銷機器人公司 高識別電銷機器人 h5 地圖標注

本文實例講述了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:

?php
class 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:

?php
class 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:

?php
class 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:

?php
class 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相關內容感興趣的讀者可查看本站專題:《PHP錯誤與異常處理方法總結》、《php字符串(string)用法總結》、《PHP數組(Array)操作技巧大全》、《PHP運算與運算符用法總結》、《PHP網絡編程技巧總結》、《PHP基本語法入門教程》、《php面向對象程序設計入門教程》及《php優秀開發框架總結》

希望本文所述對大家PHP程序設計有所幫助。

您可能感興趣的文章:
  • PHPUnit 單元測試安裝與使用入門教程
  • ThinkPHP5與單元測試PHPUnit使用詳解
  • PHPUnit + Laravel單元測試常用技能
  • PHP使用phpunit進行單元測試示例
  • 使用PHPUnit進行單元測試并生成代碼覆蓋率報告的方法
  • php中PHPUnit框架實例用法

標簽:巴中 泰州 林芝 威海 梅州 山東 成都 張家口

巨人網絡通訊聲明:本文標題《PHPUnit測試私有屬性和方法功能示例》,本文關鍵詞  PHPUnit,測試,私有,屬性,和,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHPUnit測試私有屬性和方法功能示例》相關的同類信息!
  • 本頁收集關于PHPUnit測試私有屬性和方法功能示例的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    99麻豆久久久国产精品免费 | 91精品国产综合久久福利软件| 国产精品视频线看| 欧美一卡二卡三卡| 色欧美日韩亚洲| 成人自拍视频在线观看| 成人精品视频一区| 黄色小说综合网站| 亚洲综合精品久久| 91久久久免费一区二区| 久久精品国产精品青草| 亚洲图片一区二区| 国产精品视频在线看| 国产精品午夜在线| 国产日产精品一区| 久久色在线视频| 日韩欧美精品三级| 日韩视频在线你懂得| 欧美日本乱大交xxxxx| 一本到不卡免费一区二区| 欧美sm美女调教| 高清成人免费视频| 色婷婷综合视频在线观看| jlzzjlzz亚洲日本少妇| 欧美性大战久久久久久久蜜臀| 一区二区三区欧美久久| 亚洲人成在线观看一区二区| 亚洲欧洲制服丝袜| 亚洲欧美日韩系列| 中文一区二区在线观看| 亚洲精品国产精华液| 五月婷婷久久丁香| 日韩免费电影网站| 99久久精品国产一区| 69久久夜色精品国产69蝌蚪网| 在线影视一区二区三区| 成人av免费观看| 精品国产免费视频| 综合久久给合久久狠狠狠97色| 亚洲日本免费电影| 天堂va蜜桃一区二区三区| 国产成人综合在线| 91福利在线观看| 国产精品久久久久桃色tv| 亚洲一二三区在线观看| 老司机精品视频线观看86| 一本大道久久a久久精二百 | 免费人成在线不卡| 国产高清亚洲一区| 欧美精品电影在线播放| 丝袜美腿亚洲色图| 国产91丝袜在线播放| 日韩一区二区三区视频在线 | 欧美日韩一级二级| 欧美激情中文字幕| 国产精品99精品久久免费| 国产成人午夜电影网| 中文字幕免费不卡在线| 天天操天天干天天综合网| 91在线国产观看| 成人激情图片网| 欧美撒尿777hd撒尿| 亚洲欧美电影院| 国产成人欧美日韩在线电影| 久久久久久毛片| 国产成人在线视频播放| 国产视频911| 国产一区二区三区免费播放| 久久久91精品国产一区二区三区| 亚洲欧美日韩国产中文在线| 色系网站成人免费| 麻豆国产精品777777在线| 另类欧美日韩国产在线| 中日韩免费视频中文字幕| 国产精品久久久久国产精品日日| 国产成人日日夜夜| 亚洲成人在线免费| 国产三级精品三级在线专区| 欧美在线一二三| 国内不卡的二区三区中文字幕| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 91成人网在线| 成人黄色综合网站| 另类小说综合欧美亚洲| 亚洲精品亚洲人成人网| 欧美激情一区在线| 日韩欧美国产麻豆| 久久久噜噜噜久噜久久综合| 一区二区三区在线观看国产| 91精品国产综合久久香蕉麻豆| 亚洲电影激情视频网站| av高清不卡在线| 亚洲一区欧美一区| 欧美一级久久久久久久大片| 亚洲国产精品尤物yw在线观看| 欧美亚日韩国产aⅴ精品中极品| 国内外精品视频| 日韩一区在线播放| 久久综合九色综合97婷婷女人 | 日韩一区二区三区免费观看| 在线观看国产精品网站| 94-欧美-setu| 久久久久国产精品麻豆| 激情综合网天天干| 亚洲成av人综合在线观看| 亚洲一区中文日韩| 亚洲国产精品成人综合| 26uuu亚洲综合色| 99热99精品| 国产一区二区视频在线| 日产欧产美韩系列久久99| 久久国产精品区| 国产成人免费在线视频| 成人午夜在线免费| 成人伦理片在线| 丰满白嫩尤物一区二区| 日韩精品一区国产麻豆| 欧美精品一区二区久久婷婷| 欧美一区二视频| 国产农村妇女精品| 亚洲欧洲美洲综合色网| 五月天视频一区| 美国十次综合导航| 亚洲精品乱码久久久久| 久久精品一区蜜桃臀影院| 久久综合狠狠综合久久激情| 亚洲色图欧洲色图| 亚洲观看高清完整版在线观看| 天天av天天翘天天综合网色鬼国产| 一区二区高清在线| 经典三级一区二区| 在线影视一区二区三区| 国产欧美一区二区在线| 日本vs亚洲vs韩国一区三区 | 成人午夜视频在线| 91福利区一区二区三区| 国产免费成人在线视频| 亚洲黄色免费电影| 精品亚洲成av人在线观看| 成人毛片在线观看| 欧美一级黄色录像| 亚洲成av人片www| 日韩一区二区三区在线视频| 中文字幕制服丝袜成人av| 一区二区三区91| 欧美大片拔萝卜| 国产精品成人在线观看| 日韩va亚洲va欧美va久久| 亚洲人成网站影音先锋播放| 国产精品一区二区视频| 欧美巨大另类极品videosbest | 亚洲桃色在线一区| 成人免费三级在线| 国产清纯白嫩初高生在线观看91 | 午夜久久久久久| 欧美一三区三区四区免费在线看| 亚洲人妖av一区二区| 国产精品自拍网站| 日韩欧美国产一区二区三区 | 国产精品美女久久福利网站| 色综合久久中文综合久久97| 中文字幕的久久| 成人黄色国产精品网站大全在线免费观看| 欧美一区二区三区在| 视频在线观看一区| 久久丝袜美腿综合| 色偷偷久久一区二区三区| 亚洲欧美一区二区三区极速播放 | av福利精品导航| 日韩电影在线免费看| 国产亚洲欧美色| 不卡一区中文字幕| 亚洲综合图片区| 精品久久人人做人人爰| 欧美色老头old∨ideo| 久久99久久99精品免视看婷婷 | 精品国产一区二区三区久久久蜜月| 国产一区二区成人久久免费影院| 99综合电影在线视频| 一区二区三区精品视频在线| 日韩一级免费一区| 色视频成人在线观看免| 日韩av在线播放中文字幕| 中文字幕欧美区| 欧美午夜宅男影院| 高潮精品一区videoshd| 五月天亚洲精品| 一个色在线综合| 日韩一区在线播放| 精品国产自在久精品国产| 欧美电影免费观看高清完整版 | 亚洲免费av在线| 欧美精品一区二区不卡| 欧美日韩精品一区二区三区蜜桃| 国产精品亚洲第一区在线暖暖韩国| 亚洲老司机在线| 精品播放一区二区| 欧美一区二区三区思思人| 欧美另类z0zxhd电影| 色偷偷久久一区二区三区|