国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
什么是模擬?
設(shè)置
創(chuàng)建單元測(cè)試
高級(jí)用法
結(jié)論
關(guān)于 Mockery 和測(cè)試依賴項(xiàng)的常見(jiàn)問(wèn)題解答 (FAQ)
什么是 Mockery,為什么它在 PHP 測(cè)試中很重要?
如何在我的 PHP 項(xiàng)目中安裝和設(shè)置 Mockery?
如何使用 Mockery 創(chuàng)建模擬對(duì)象?
如何在 Mockery 中定義期望?
Mockery 中模擬和存根的區(qū)別是什么?
如何使用 Mockery 測(cè)試私有方法?
如何在 Mockery 中處理構(gòu)造函數(shù)參數(shù)?
如何使用 Mockery 模擬靜態(tài)方法?
如何驗(yàn)證 Mockery 中是否已滿足所有期望?
如何在 Mockery 中處理異常?
首頁(yè) 后端開(kāi)發(fā) php教程 用嘲笑嘲笑您的測(cè)試依賴性

用嘲笑嘲笑您的測(cè)試依賴性

Feb 20, 2025 am 09:07 AM

Mock your Test Dependencies with Mockery

雖然并非每個(gè)人都在這樣做,但測(cè)試你的應(yīng)用程序是作為開(kāi)發(fā)人員最基本的部分之一。單元測(cè)試是最常見(jiàn)的測(cè)試。通過(guò)單元測(cè)試,你可以檢查一個(gè)類是否完全按照你的預(yù)期那樣運(yùn)行。有時(shí),你在你的應(yīng)用程序中使用的是第三方服務(wù),很難設(shè)置好所有內(nèi)容來(lái)進(jìn)行單元測(cè)試。這正是模擬發(fā)揮作用的時(shí)候。

關(guān)鍵要點(diǎn)

  • 模擬是創(chuàng)建一個(gè)替代單元測(cè)試中真實(shí)對(duì)象的替代對(duì)象的過(guò)程,這在測(cè)試嚴(yán)重依賴依賴注入的應(yīng)用程序時(shí)特別有用。
  • Mockery 是 Pádraic Brady 創(chuàng)建的一個(gè)庫(kù),可用于模擬單元測(cè)試中的對(duì)象,為 PHPUnit 的默認(rèn)模擬功能提供了一種替代方案。
  • Mockery 允許開(kāi)發(fā)人員定義對(duì)方法調(diào)用次數(shù)、將接收的參數(shù)以及將返回的值的期望,使其成為隔離單元測(cè)試中依賴項(xiàng)的強(qiáng)大工具。
  • 雖然 PHPUnit 已經(jīng)可以模擬對(duì)象,但 Mockery 為希望確保其單元測(cè)試不受其他類影響的開(kāi)發(fā)人員提供了更大的靈活性和便利性。

什么是模擬?

模擬對(duì)象只不過(guò)是創(chuàng)建一個(gè)替代對(duì)象,它在單元測(cè)試中替換真實(shí)對(duì)象。如果你的應(yīng)用程序嚴(yán)重依賴依賴注入,模擬是可行的方法。

模擬對(duì)象可能有幾個(gè)原因:

  1. 執(zhí)行單元測(cè)試時(shí),最好隔離類。你不想讓另一個(gè)類或服務(wù)干擾你的單元測(cè)試。
  2. 對(duì)象尚不存在。你可以先創(chuàng)建測(cè)試,然后構(gòu)建最終對(duì)象。
  3. 模擬對(duì)象通常比為測(cè)試準(zhǔn)備整個(gè)數(shù)據(jù)庫(kù)更快。

運(yùn)行單元測(cè)試時(shí),你可能正在使用 PHPUnit。PHPUnit 帶有一些默認(rèn)的模擬功能,如文檔中所示。你可以在 Jeune Asuncion 撰寫的這篇文章中閱讀更多關(guān)于模擬的常規(guī)信息以及 PHPUnit 的模擬功能。

在本文中,我們將深入探討由 Pádraic Brady 創(chuàng)建的庫(kù) Mockery。我們將創(chuàng)建一個(gè)溫度類,該類將注入當(dāng)前不存在的天氣服務(wù)。

設(shè)置

讓我們從設(shè)置項(xiàng)目開(kāi)始。我們從包含以下內(nèi)容的 composer.json 文件開(kāi)始。這將確保我們擁有 mockery 和 PHPUnit。

<code>{
    "name": "sitepoint/weather",
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-0": { "": "src/" }
    },
    "require-dev": {
        "phpunit/phpunit": "4.1.*",
        "mockery/mockery": "0.9.*"
    }
}</code>

我們還創(chuàng)建一個(gè)名為 phpunit.xml 的 PHPUnit 配置文件

<phpunit>
    <testsuite name="SitePoint Weather">
        <directory>./tests</directory>
    </testsuite>
    <listeners>
        <listener class="\Mockery\Adapter\Phpunit\TestListener"
                  file="vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php"/>
    </listeners>
</phpunit>

定義這個(gè)監(jiān)聽(tīng)器很重要。如果沒(méi)有監(jiān)聽(tīng)器,如果方法 once()、twice()times() 使用不正確,則不會(huì)引發(fā)錯(cuò)誤。稍后將詳細(xì)介紹。

我還創(chuàng)建了 2 個(gè)目錄。src 目錄用于保存我的類,tests 目錄用于存儲(chǔ)我們的測(cè)試。在 src 目錄中,我創(chuàng)建了路徑 SitePointWeather。

我們首先創(chuàng)建 WeatherServiceInterface。我們不存在的天氣服務(wù)將實(shí)現(xiàn)此接口。在這種情況下,我們只提供一個(gè)方法,該方法將為我們提供攝氏溫度。

<code>{
    "name": "sitepoint/weather",
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-0": { "": "src/" }
    },
    "require-dev": {
        "phpunit/phpunit": "4.1.*",
        "mockery/mockery": "0.9.*"
    }
}</code>

因此,我們有一個(gè)服務(wù)可以為我們提供攝氏溫度。我想獲得華氏溫度。為此,我創(chuàng)建了一個(gè)名為 TemperatureService 的新類。此服務(wù)將注入天氣服務(wù)。除此之外,我們還定義了一個(gè)方法,該方法將攝氏溫度轉(zhuǎn)換為華氏溫度。

<phpunit>
    <testsuite name="SitePoint Weather">
        <directory>./tests</directory>
    </testsuite>
    <listeners>
        <listener class="\Mockery\Adapter\Phpunit\TestListener"
                  file="vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php"/>
    </listeners>
</phpunit>

創(chuàng)建單元測(cè)試

我們已經(jīng)準(zhǔn)備好設(shè)置單元測(cè)試了。我們?cè)?tests 目錄中創(chuàng)建一個(gè) TemperatureServiceTest 類。在這個(gè)類中,我們創(chuàng)建方法 testGetTempFahrenheit(),它將測(cè)試我們的華氏方法。

此方法中要做的第一步是創(chuàng)建一個(gè)新的 TemperatureService 對(duì)象。就在我們這樣做的時(shí)候,我們的構(gòu)造函數(shù)將請(qǐng)求一個(gè)實(shí)現(xiàn)了 WeatherServiceInterface 的對(duì)象。由于我們還沒(méi)有這樣的對(duì)象(我們也不想要),我們將使用 Mockery 為我們創(chuàng)建一個(gè)模擬對(duì)象。讓我們看看完成后的方法是什么樣的。

namespace SitePoint\Weather;

interface WeatherServiceInterface
{
    /**
     * 返回?cái)z氏溫度
     *
     * @return float
     */
    public function getTempCelsius();
}

我們首先創(chuàng)建模擬對(duì)象。我們告訴 Mockery 我們想要模擬哪個(gè)對(duì)象(或接口)。第二步是描述將在此模擬對(duì)象上調(diào)用的方法。在 shouldReceive() 方法中,我們定義將調(diào)用的方法的名稱。

我們定義此方法將調(diào)用的次數(shù)。我們可以使用 once()twice()times(X)。在這種情況下,我們預(yù)計(jì)它只會(huì)調(diào)用一次。如果未調(diào)用或調(diào)用次數(shù)過(guò)多,單元測(cè)試將失敗。

最后,我們?cè)?andReturn() 方法中定義將返回的值。在這種情況下,我們返回 25。Mockery 還具有 andReturnNull()andReturnSelf()andReturnUndefined() 等返回方法。如果這是你的預(yù)期,Mockery 也能夠拋出異常。

我們現(xiàn)在有了模擬對(duì)象,可以創(chuàng)建我們的 TemperatureService 對(duì)象并像往常一樣進(jìn)行測(cè)試。25 攝氏度是 77 華氏度,因此我們檢查是否從我們的 getTempFahrenheit() 方法中收到 77。

如果你在你的根目錄中運(yùn)行 vendor/bin/phpunit tests/,你將從 PHPUnit 獲得綠燈,表明一切都很完美。

高級(jí)用法

上面的例子相當(dāng)簡(jiǎn)單。沒(méi)有參數(shù),只是一個(gè)簡(jiǎn)單的調(diào)用。讓我們讓事情變得復(fù)雜一些。

假設(shè)我們的天氣服務(wù)還有一個(gè)方法可以在確切的小時(shí)獲取溫度。我們將以下方法添加到我們當(dāng)前的 WeatherServiceInterface。

namespace SitePoint\Weather;

class TemperatureService
{
    /**
     * @var WeatherServiceInterace $weatherService 保存天氣服務(wù)
     */
    private $weatherService;

    /**
     * 構(gòu)造函數(shù)。
     *
     * @param WeatherServiceInterface $weatherService
     */
    public function __construct(WeatherServiceInterface $weatherService) {
        $this->weatherService = $weatherService;
    }

    /**
     * 獲取當(dāng)前華氏溫度
     *
     * @return float
     */
    public function getTempFahrenheit() {
        return ($this->weatherService->getTempCelsius() * 1.8000) + 32;
    }
}

我們想知道,晚上 0:00 到 6:00 之間的平均溫度是多少。為此,我們?cè)?TemperatureService 中創(chuàng)建一個(gè)新方法來(lái)計(jì)算平均溫度。為此,我們從 WeatherService 中檢索 7 個(gè)溫度并計(jì)算平均值。

<code>{
    "name": "sitepoint/weather",
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-0": { "": "src/" }
    },
    "require-dev": {
        "phpunit/phpunit": "4.1.*",
        "mockery/mockery": "0.9.*"
    }
}</code>

讓我們看看我們的測(cè)試方法。

<phpunit>
    <testsuite name="SitePoint Weather">
        <directory>./tests</directory>
    </testsuite>
    <listeners>
        <listener class="\Mockery\Adapter\Phpunit\TestListener"
                  file="vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php"/>
    </listeners>
</phpunit>

我們?cè)俅文M接口,并定義將調(diào)用的方法。接下來(lái),我們定義此方法將調(diào)用的次數(shù)。我們?cè)谇懊娴氖纠惺褂昧?once(),現(xiàn)在我們使用 times(7) 來(lái)指示我們期望此方法被調(diào)用 7 次。如果該方法沒(méi)有被精確調(diào)用 7 次,則測(cè)試將失敗。如果你沒(méi)有在 phpunit.xml 配置文件中定義監(jiān)聽(tīng)器,你將不會(huì)收到關(guān)于此的通知。

接下來(lái),我們定義 with() 方法。在 with 方法中,你可以定義你期望的參數(shù)。在這種情況下,我們期望 7 個(gè)不同的小時(shí)。

最后,我們有 andReturn() 方法。在這種情況下,我們指示了 7 個(gè)返回值。如果你定義的返回值較少,則每次都會(huì)重復(fù)最后一個(gè)可用的返回值。

當(dāng)然,Mockery 可以做更多的事情。有關(guān)完整的指南和文檔,我建議你查看 Github 頁(yè)面。

如果你對(duì)上面項(xiàng)目的代碼感興趣,你可以查看這個(gè) Github 頁(yè)面。

結(jié)論

使用 PHPUnit,你已經(jīng)可以模擬對(duì)象了。但是,你也可以像上面示例中解釋的那樣使用 Mockery。如果你正在對(duì)你的類進(jìn)行單元測(cè)試,并且你不想讓任何其他類影響你的測(cè)試,mockery 可以輕松地幫助你。如果你真的想進(jìn)行功能測(cè)試,最好看看你是否可以集成真正的測(cè)試。你目前是否正在使用 PHPUnit 模擬并考慮切換到 Mockery?你想在后續(xù)文章中看到更多更大的 Mockery 示例嗎?請(qǐng)?jiān)谙旅娴脑u(píng)論中告訴我。

關(guān)于 Mockery 和測(cè)試依賴項(xiàng)的常見(jiàn)問(wèn)題解答 (FAQ)

什么是 Mockery,為什么它在 PHP 測(cè)試中很重要?

Mockery 是一個(gè)強(qiáng)大而靈活的 PHP 模擬對(duì)象框架,用于單元測(cè)試。它被設(shè)計(jì)為 PHPUnit 模擬對(duì)象功能的直接替代品。Mockery 允許開(kāi)發(fā)人員隔離被測(cè)代碼并創(chuàng)建測(cè)試替身,這些測(cè)試替身模擬復(fù)雜對(duì)象的行為。這在單元測(cè)試中至關(guān)重要,因?yàn)樗_保被測(cè)代碼不依賴于任何外部因素或狀態(tài)。

如何在我的 PHP 項(xiàng)目中安裝和設(shè)置 Mockery?

要安裝 Mockery,你需要擁有 Composer,這是一個(gè) PHP 的依賴項(xiàng)管理器。你可以通過(guò)運(yùn)行命令 composer require --dev mockery/mockery 來(lái)安裝 Mockery。安裝后,你可以在測(cè)試文件中通過(guò)在測(cè)試拆卸方法中調(diào)用 Mockery::close() 來(lái)設(shè)置 Mockery,以清理模擬對(duì)象。

如何使用 Mockery 創(chuàng)建模擬對(duì)象?

在 Mockery 中創(chuàng)建模擬對(duì)象很簡(jiǎn)單。你可以使用 mock() 方法來(lái)創(chuàng)建一個(gè)模擬對(duì)象。例如,$mock = Mockery::mock('MyClass'); 將創(chuàng)建一個(gè) MyClass 的模擬對(duì)象。

如何在 Mockery 中定義期望?

在 Mockery 中,你通過(guò)將方法鏈接到模擬對(duì)象來(lái)定義期望。例如,$mock->shouldReceive('myMethod')->once()->andReturn('mocked value'); 此代碼告訴 Mockery 預(yù)期“myMethod”將被調(diào)用一次,并且應(yīng)該返回“mocked value”。

Mockery 中模擬和存根的區(qū)別是什么?

在 Mockery 中,模擬是我們可以在其上設(shè)置期望的對(duì)象,而存根是預(yù)先編程了響應(yīng)的模擬對(duì)象。當(dāng)響應(yīng)是唯一重要的事情時(shí),通常使用存根,而當(dāng)測(cè)試交互本身時(shí),則使用模擬。

如何使用 Mockery 測(cè)試私有方法?

不建議直接測(cè)試私有方法,因?yàn)樗`反了封裝原則。但是,如果需要,你可以使用 Mockery 中的 shouldAllowMockingProtectedMethods() 方法來(lái)允許模擬受保護(hù)和私有方法。

如何在 Mockery 中處理構(gòu)造函數(shù)參數(shù)?

如果要模擬的類具有帶參數(shù)的構(gòu)造函數(shù),可以將它們作為數(shù)組傳遞給 mock() 方法。例如,$mock = Mockery::mock('MyClass', [$arg1, $arg2]); 將將 $arg1 和 $arg2 傳遞給 MyClass 的構(gòu)造函數(shù)。

如何使用 Mockery 模擬靜態(tài)方法?

Mockery 提供了一種使用 alias: 前綴模擬靜態(tài)方法的方法。例如,$mock = Mockery::mock('alias:MyClass'); 將創(chuàng)建一個(gè)可以用來(lái)對(duì) MyClass 的靜態(tài)方法設(shè)置期望的模擬對(duì)象。

如何驗(yàn)證 Mockery 中是否已滿足所有期望?

你可以在測(cè)試拆卸方法中使用 Mockery::close() 方法來(lái)驗(yàn)證是否已滿足所有期望。如果任何期望未滿足,Mockery 將引發(fā)異常。

如何在 Mockery 中處理異常?

你可以使用 andThrow() 方法設(shè)置模擬對(duì)象以拋出異常。例如,$mock->shouldReceive('myMethod')->andThrow(new Exception); 將在調(diào)用“myMethod”時(shí)拋出異常。

以上是用嘲笑嘲笑您的測(cè)試依賴性的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

如何在PHP中實(shí)施身份驗(yàn)證和授權(quán)? 如何在PHP中實(shí)施身份驗(yàn)證和授權(quán)? Jun 20, 2025 am 01:03 AM

tosecurelyhandleauthenticationandationallizationInphp,lofterTheSesteps:1.AlwaysHashPasswordSwithPassword_hash()andverifyusingspasspassword_verify(),usepreparedStatatementStopreventsqlineptions,andStoreSeruserDatain usseruserDatain $ _sessiveferterlogin.2.implementrole-2.imaccessccsccccccccccccccccccccccccc.

如何在PHP中安全地處理文件上傳? 如何在PHP中安全地處理文件上傳? Jun 19, 2025 am 01:05 AM

要安全處理PHP中的文件上傳,核心在于驗(yàn)證文件類型、重命名文件并限制權(quán)限。1.使用finfo_file()檢查真實(shí)MIME類型,僅允許特定類型如image/jpeg;2.用uniqid()生成隨機(jī)文件名,存儲(chǔ)至非Web根目錄;3.通過(guò)php.ini和HTML表單限制文件大小,設(shè)置目錄權(quán)限為0755;4.使用ClamAV掃描惡意軟件,增強(qiáng)安全性。這些步驟有效防止安全漏洞,確保文件上傳過(guò)程安全可靠。

PHP中==(松散比較)和===(嚴(yán)格的比較)之間有什么區(qū)別? PHP中==(松散比較)和===(嚴(yán)格的比較)之間有什么區(qū)別? Jun 19, 2025 am 01:07 AM

在PHP中,==與===的主要區(qū)別在于類型檢查的嚴(yán)格程度。==在比較前會(huì)進(jìn)行類型轉(zhuǎn)換,例如5=="5"返回true,而===要求值和類型都相同才會(huì)返回true,例如5==="5"返回false。使用場(chǎng)景上,===更安全應(yīng)優(yōu)先使用,==僅在需要類型轉(zhuǎn)換時(shí)使用。

如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? 如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? Jun 19, 2025 pm 05:13 PM

PHP中使用基本數(shù)學(xué)運(yùn)算的方法如下:1.加法用 號(hào),支持整數(shù)和浮點(diǎn)數(shù),也可用于變量,字符串?dāng)?shù)字會(huì)自動(dòng)轉(zhuǎn)換但不推薦依賴;2.減法用-號(hào),變量同理,類型轉(zhuǎn)換同樣適用;3.乘法用*號(hào),適用于數(shù)字及類似字符串;4.除法用/號(hào),需避免除以零,并注意結(jié)果可能是浮點(diǎn)數(shù);5.取模用%號(hào),可用于判斷奇偶數(shù),處理負(fù)數(shù)時(shí)余數(shù)符號(hào)與被除數(shù)一致。正確使用這些運(yùn)算符的關(guān)鍵在于確保數(shù)據(jù)類型清晰并處理好邊界情況。

如何與PHP的NOSQL數(shù)據(jù)庫(kù)(例如MongoDB,Redis)進(jìn)行交互? 如何與PHP的NOSQL數(shù)據(jù)庫(kù)(例如MongoDB,Redis)進(jìn)行交互? Jun 19, 2025 am 01:07 AM

是的,PHP可以通過(guò)特定擴(kuò)展或庫(kù)與MongoDB和Redis等NoSQL數(shù)據(jù)庫(kù)交互。首先,使用MongoDBPHP驅(qū)動(dòng)(通過(guò)PECL或Composer安裝)創(chuàng)建客戶端實(shí)例并操作數(shù)據(jù)庫(kù)及集合,支持插入、查詢、聚合等操作;其次,使用Predis庫(kù)或phpredis擴(kuò)展連接Redis,執(zhí)行鍵值設(shè)置與獲取,推薦phpredis用于高性能場(chǎng)景,Predis則便于快速部署;兩者均適用于生產(chǎn)環(huán)境且文檔完善。

我如何了解最新的PHP開(kāi)發(fā)和最佳實(shí)踐? 我如何了解最新的PHP開(kāi)發(fā)和最佳實(shí)踐? Jun 23, 2025 am 12:56 AM

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

什么是PHP,為什么它用于Web開(kāi)發(fā)? 什么是PHP,為什么它用于Web開(kāi)發(fā)? Jun 23, 2025 am 12:55 AM

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

如何設(shè)置PHP時(shí)區(qū)? 如何設(shè)置PHP時(shí)區(qū)? Jun 25, 2025 am 01:00 AM

tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

See all articles