亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

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

用嘲笑嘲笑您的測試依賴性

Feb 20, 2025 am 09:07 AM

Mock your Test Dependencies with Mockery

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

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

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

什麼是模擬?

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

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

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

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

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

設(shè)置

讓我們從設(shè)置項(xiàng)目開始。我們從包含以下內(nèi)容的 composer.json 文件開始。這將確保我們擁有 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)聽器很重要。如果沒有監(jiān)聽器,如果方法 once()、twice()times() 使用不正確,則不會(huì)引發(fā)錯(cuò)誤。稍後將詳細(xì)介紹。

我還創(chuàng)建了 2 個(gè)目錄。 src 目錄用於保存我的類,tests 目錄用於存儲(chǔ)我們的測試。在 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)建單元測試

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

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

namespace SitePoint\Weather;

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

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

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

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

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

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

高級(jí)用法

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

假設(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 之間的平均溫度是多少。為此,我們在 TemperatureService 中創(chuàng)建一個(gè)新方法來計(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>

讓我們看看我們的測試方法。

<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>

我們再次模擬接口,並定義將調(diào)用的方法。接下來,我們定義此方法將調(diào)用的次數(shù)。我們在前面的示例中使用了 once(),現(xiàn)在我們使用 times(7) 來指示我們期望此方法被調(diào)用 7 次。如果該方法沒有被精確調(diào)用 7 次,則測試將失敗。如果你沒有在 phpunit.xml 配置文件中定義監(jiān)聽器,你將不會(huì)收到關(guān)於此的通知。

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

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

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

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

結(jié)論

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

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

什麼是 Mockery,為什麼它在 PHP 測試中很重要?

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

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

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

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

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

如何在 Mockery 中定義期望?

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

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

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

如何使用 Mockery 測試私有方法?

不建議直接測試私有方法,因?yàn)樗`反了封裝原則。但是,如果需要,你可以使用 Mockery 中的 shouldAllowMockingProtectedMethods() 方法來允許模擬受保護(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è)可以用來對 MyClass 的靜態(tài)方法設(shè)置期望的模擬對象。

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

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

如何在 Mockery 中處理異常?

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

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

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)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脫衣器

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整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
PHP變量範(fàn)圍解釋了 PHP變量範(fàn)圍解釋了 Jul 17, 2025 am 04:16 AM

PHP變量作用域常見問題及解決方法包括:1.函數(shù)內(nèi)部無法訪問全局變量,需使用global關(guān)鍵字或參數(shù)傳入;2.靜態(tài)變量用static聲明,只初始化一次並在多次調(diào)用間保持值;3.超全局變量如$_GET、$_POST可在任何作用域直接使用,但需注意安全過濾;4.匿名函數(shù)需通過use關(guān)鍵字引入父作用域變量,修改外部變量則需傳遞引用。掌握這些規(guī)則有助於避免錯(cuò)誤並提升代碼穩(wěn)定性。

如何在PHP中牢固地處理文件上傳? 如何在PHP中牢固地處理文件上傳? Jul 08, 2025 am 02:37 AM

要安全處理PHP文件上傳需驗(yàn)證來源與類型、控製文件名與路徑、設(shè)置服務(wù)器限制並二次處理媒體文件。 1.驗(yàn)證上傳來源通過token防止CSRF並通過finfo_file檢測真實(shí)MIME類型使用白名單控制;2.重命名文件為隨機(jī)字符串並根據(jù)檢測類型決定擴(kuò)展名存儲(chǔ)至非Web目錄;3.PHP配置限制上傳大小及臨時(shí)目錄Nginx/Apache禁止訪問上傳目錄;4.GD庫重新保存圖片清除潛在惡意數(shù)據(jù)。

在PHP中評論代碼 在PHP中評論代碼 Jul 18, 2025 am 04:57 AM

PHP註釋代碼常用方法有三種:1.單行註釋用//或#屏蔽一行代碼,推薦使用//;2.多行註釋用/.../包裹代碼塊,不可嵌套但可跨行;3.組合技巧註釋如用/if(){}/控制邏輯塊,或配合編輯器快捷鍵提升效率,使用時(shí)需注意閉合符號(hào)和避免嵌套。

發(fā)電機(jī)如何在PHP中工作? 發(fā)電機(jī)如何在PHP中工作? Jul 11, 2025 am 03:12 AM

AgeneratorinPHPisamemory-efficientwaytoiterateoverlargedatasetsbyyieldingvaluesoneatatimeinsteadofreturningthemallatonce.1.Generatorsusetheyieldkeywordtoproducevaluesondemand,reducingmemoryusage.2.Theyareusefulforhandlingbigloops,readinglargefiles,or

撰寫PHP評論的提示 撰寫PHP評論的提示 Jul 18, 2025 am 04:51 AM

寫好PHP註釋的關(guān)鍵在於明確目的與規(guī)範(fàn),註釋應(yīng)解釋“為什麼”而非“做了什麼”,避免冗餘或過於簡單。 1.使用統(tǒng)一格式,如docblock(/*/)用於類、方法說明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背後的原因,如說明為何需手動(dòng)輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項(xiàng)與問題,便於後續(xù)追蹤與協(xié)作。好的註釋能降低溝通成本,提升代碼維護(hù)效率。

快速PHP安裝教程 快速PHP安裝教程 Jul 18, 2025 am 04:52 AM

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

如何通過php中的索引訪問字符串中的字符 如何通過php中的索引訪問字符串中的字符 Jul 12, 2025 am 03:15 AM

在PHP中獲取字符串特定索引字符可用方括號(hào)或花括號(hào),但推薦方括號(hào);索引從0開始,超出範(fàn)圍訪問返回空值,不可賦值;處理多字節(jié)字符需用mb_substr。例如:$str="hello";echo$str[0];輸出h;而中文等字符需用mb_substr($str,1,1)獲取正確結(jié)果;實(shí)際應(yīng)用中循環(huán)訪問前應(yīng)檢查字符串長度,動(dòng)態(tài)字符串需驗(yàn)證有效性,多語言項(xiàng)目建議統(tǒng)一使用多字節(jié)安全函數(shù)。

學(xué)習(xí)PHP:初學(xué)者指南 學(xué)習(xí)PHP:初學(xué)者指南 Jul 18, 2025 am 04:54 AM

易於效率,啟動(dòng)啟動(dòng)tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)

See all articles