簡體   English   中英

如何使用PHPUnit測試一個方法調用同一個類的其他方法,但是沒有返回值

[英]How to use PHPUnit to test a method that calls other methods of the same class, but returns no value

如何為調用同一類的其他方法但不返回值的方法編寫單元測試? (假設使用 PHPUnit。)

例如,假設我有以下課程:

class MyClass {

    public function doEverything() {

        $this->doA();
        $this->doB();
        $this->doC();

    }

    public function doA() {
        // do something, return nothing
    }

    public function doB() {
        // do something, return nothing
    }

    public function doC() {
        // do something, return nothing
    }

}

你將如何測試doEverything()

編輯:

我問這個是因為從我讀過的內容來看,幾乎每種方法都應該有自己的專用單元測試。 當然,您也有功能和集成測試,但可以這么說,這些測試針對特定的例程(不一定在每個方法級別上)。

但是,如果幾乎每種方法都需要自己的單元測試,我認為對上述所有方法進行單元測試是“最佳實踐”。 是/否?

好的! 我已經想通了! 正如所料,嘲諷是什么,我需要在這種情況下-和嘲諷兄弟姐妹方法稱為部分嘲諷 Juan Treminio 的這篇文章中,有一些關於 PHPUnit 模擬的非常好的信息。

所以要在上面的類中測試doEverything() ,我需要做這樣的事情:

public function testDoEverything()
{

    // Any methods not specified in setMethods will execute perfectly normally,
    // and any methods that ARE specified return null (or whatever you specify)
    $mock = $this->getMockBuilder('\MyClass')
        ->setMethods(array('doA', 'doB', 'doC'))
        ->getMock();

    // doA() should be called once
    $mock->expects($this->once())
         ->method('doA');

    // doB() should be called once
    $mock->expects($this->once())
         ->method('doB');

    // doC() should be called once
    $mock->expects($this->once())
         ->method('doC');

    // Call doEverything and see if it calls the functions like our
    // above written expectations specify
    $mock->doEverything();
}

就是這樣! 挺容易!

獎勵:如果你使用 Laravel 和 Codeception ......

我正在使用 Laravel 框架以及 Codeception,這使得弄清楚它有點棘手。 如果您使用 Laravel 和 Codeception,您需要做更多工作才能使其正常工作,因為 Laravel 自動加載默認情況下不會連接到 PHPUnit 測試。 您基本上需要更新您的unit.suite.yml以包含 Laravel4,如下所示:

# Codeception Test Suite Configuration

# suite for unit (internal) tests.
class_name: UnitTester
modules:
    enabled: [Asserts, UnitHelper, Laravel4]

一旦你更新了你的文件,不要忘記調用php codecept.phar build來更新你的配置。

雖然您的模擬測試確實實現了您的目標,但我認為您已經降低了對代碼的信心。 將原始的瑣碎方法與測試它的復雜方法進行比較。 被測方法可能失敗的唯一方法是忘記添加方法調用之一或錯誤輸入名稱。 但是您現在很可能使用所有這些額外的代碼來做到這一點,而且它沒有任何測試!

規則:如果您的測試代碼比被測代碼更復雜,則它需要自己的測試。

鑒於上述情況,您最好找到另一種方法來測試原始代碼。 對於所寫的方法——三個沒有參數的方法調用——用眼球檢查就足夠了。 但我懷疑該方法確實在某處有一些副作用,否則您可以將其刪除。

單元測試是將類作為一個單元進行測試,而不是單獨測試每個方法。 單獨測試每種方法很好地表明您是在代碼之后編寫測試。 采用測試驅動開發並首先編寫測試將幫助您設計一個更易於測試的更好的類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM