簡體   English   中英

將PHPUnit依賴項注入到TestCase中

[英]PHPUnit Dependency Injection Into A TestCase

我想知道是否有可能通過例如某些上下文測試套件將依賴項注入到從PHPUnit_Framework_TestCase派生的類中,這種方式使得PHPUnit可以處理無論是否已使用phpunit.xml配置文件手動調用它的方式?

請考慮以下示例:

<?php
interface AnyGreeter {   
    public function greet($recipient);
}   

class FriendlyGreeter implements AnyGreeter {   
    public function greet($recipient) {   
        return "Hello {$recipient}!";
    }   
}   

class DorkGreeter implements AnyGreeter {
    public function greet($recipient) {   
        return "Get lost, {$recipient}!";
    }   
}

現在,我想為實現AnyGreeter類提供一些常規測試,例如:

<?php
class GeeterTest extends PHPUnit_Framework_TestCase {

    public function testGreet() {   
        $greeter = $this->getGreeter();
        $message = $greeter->greet("world");
        $this->assertContains("world", $message);
    }   

    public function setGreeter(AnyGreeter $greeter) {   
        $this->greeter = $greeter;
    }   

    public function getGreeter() {   
        if (null === $this->greeter) {
            $this->markTestSkipped("No greeter provided");
        }   
        return $this->greeter;
    }

    private $greeter;
} 

這可能會被我自己以及任何將來的實現(我無法控制)重新使用。

這怎么可能,尤其是在嚴重依賴接口的項目中? 我不想編寫抽象測試並將其擴展到每個實現中-

謝謝!

我從未見過這樣做,文檔中也沒有任何內容。 測試似乎有點復雜。 我可以通過使用數據提供程序將greeter對象傳遞給testGreeter方法來解決您的問題,然后您所要做的就是在提供程序中維護一系列具體的greeter類。

請參閱此處的“數據提供者”部分: http : //www.phpunit.de/manual/3.2/en/writing-tests-for-phpunit.html

我認為您最好的方法是使用Glen提到的提供程序:

class GreeterTestCase extends PHPUnit_Framework_TestCase
{
    protected function getGreeter()
    {   
    }   

    /** 
     * @dataProvider providerGreeter
     */
    public function testGreet(AnyGreeter $greeter)
    {   
        $message = $greeter->greet('world');
        $this->assertType('string', $message, 'AnyGreeter::greet() must return string');
        $this->assertContains('world', $message);
    }   

    public function providerGreeter()
    {   
        return array(array($this->getGreeter()));
    }   
}

這樣,庫的其他部分可以擴展此測試用例,以測試其自己的實現是否符合基本接口規范。 他們特定於該實現的任何自定義單元測試都在擴展測試用例中進行。

現在,您可以選擇測試單個實現(可能具有自己的單元測試),也可以將一組實現組合在一起以獲取默認測試:

class AnyGreeterTestCase extends GreeterTestCase
{
    public function providerGreeter()
    {
        return array(
            array(new FriendlyGreeter()),
            array(new DorkGreeter()),
        );
    }
}

暫無
暫無

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

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