簡體   English   中英

父方法調用的單元測試

[英]Unit Test for Parent Method Call

奇怪的是,我不僅沒有找到答案,而且這個問題似乎根本就沒有問題。 但是,這是給我的。

您如何通過PHPUnit設置對父方法調用的期望?

我已經閱讀了答案和討論,其重點是“您不需要為此進行測試,只需測試它是否有效”。 這是完全錯誤的。 單元測試在那里測試實現的內部。 測試“有效”是針對功能測試。

更多上下文:我有一個異常實現,該異常接受構造函數的其他參數,因此自然需要調用parent::__construct()方法,將消息,代碼和內部異常轉發給該方法。 知道父方法有效,並且不需要測試:它是本機PHP類,即使不是,該代碼也不在我正在測試的類中。 因此,我只需要設置一些期望值,其中之一就是使用適當的args調用父__construct()方法。 當然,構造函數並不是唯一可能需要這樣做的情況。

有任何想法嗎?

至於PHPUnit並檢查父方法調用,這是不可能的。 您始終可以創建類的模擬,並檢查是否調用了父構造函數,但是您僅在測試模擬而不是實際類。 而這絕對不是您想要的。 正如其他人已經在另一個答案中指出的那樣:您不要模擬或存根被測對象( https://stackoverflow.com/a/6711948/4737924 )。

您說的是,您需要知道父構造函數已被調用。 我認為這只是實施的技術細節。 您真正需要知道的是異常的行為是否與需要的行為相同。

看下面的例子:

class MyException extends Exception
{
    private $somethingElse;

    public function __construct(string $message, int $code, Throwable $previousException, SomethingElse $somethingElse)
    {
        $message = $message . ' - my additional message';
        parent::__construct($message, $code, $previousException);

        $this->somethingElse = $somethingElse;
    }

    public function getSomethingElse(): SomethingElse
    {
        return $this->somethingElse;
    }
}

class MyExceptionTest extends TestCase
{
    public function testIsCreatedProperly(): void
    {
        $previousException = new Exception();
        $somethingElse = new SomethingElse();

        $exception = new MyException('My message', 100, $previousException, $somethingElse);

        $this->assertSame('My message -  my additional message', $exception->getMessage());
        $this->assertSame(100, $exception->getCode());
        $this->assertSame($previousException, $exception->getPrevious());
        $this->assertSame($somethingElse, $exception->getSomethingElse());
    }
}

這里只有行為很重要。 與消息的正確性,代碼或先前的異常的發生方式無關緊要。 重要的是它的行為是否符合您的期望。 您無需顯式檢查是否調用了父構造函數。 您知道它之所以被調用是因為輸出符合預期。

您可以創建類似於以下特征的smth,並在需要模擬父方法調用的所有類中使用它:

trait ParentCallTestable
{
    /**
     * Call parent methdod
     * @param  string $method  Method name to call
     * @return mixed
     */
    public function parent($method, ...$args)
    {
        return parent::$method(...$args);
    }
}

然后在使用此特征的類中,標准父調用

$result = parent::fooMethod($arg1, $arg2);

被替換為

$result = $this->parent('fooMethod', $arg1, $arg2);

您可以輕松地對其進行嘲笑。

暫無
暫無

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

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