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