如何对 PHP 特征进行单元测试

Posted

技术标签:

【中文标题】如何对 PHP 特征进行单元测试【英文标题】:How to unit test PHP traits 【发布时间】:2015-09-13 23:58:07 【问题描述】:

我想知道是否有关于的解决方案。

我知道我们可以测试一个使用 trait 的类,但我想知道是否有更好的方法。

提前感谢您的任何建议:)

编辑

另一种方法是在测试类本身中使用 Trait,我将在下面演示。

但是我并不热衷于这种方法,因为无法保证特征、类和phpUnit_Framework_TestCase(在此示例中)之间没有类似的方法名称:

这是一个示例特征:

trait IndexableTrait

    /** @var int */
    private $index;

    /**
     * @param $index
     * @return $this
     * @throw \InvalidArgumentException
     */
    public function setIndex($index)
    
        if (false === filter_var($index, FILTER_VALIDATE_INT)) 
            throw new \InvalidArgumentException('$index must be integer.');
        

        $this->index = $index;

        return $this;
    

    /**
     * @return int|null
     */
    public function getIndex()
    
        return $this->index;
    

及其测试:

class TheAboveTraitTest extends \PHPUnit_Framework_TestCase

    use TheAboveTrait;

    public function test_indexSetterAndGetter()
    
        $this->setIndex(123);
        $this->assertEquals(123, $this->getIndex());
    

    public function test_indexIntValidation()
    
        $this->setExpectedException(\Exception::class, '$index must be integer.');
        $this->setIndex('bad index');
    

【问题讨论】:

请提供您尝试执行此操作但不起作用的代码。这会帮助别人帮助你。 @AdamB,我自己写了first answer,里面有示例代码。但请注意,它不像某些东西坏了或不起作用,我只是想知道是否有任何好的方法可以直接而不是通过单元测试使用该特征的类来间接地对特征进行单元测试。坦克 【参考方案1】:

您可以使用类似于测试抽象类的具体方法来测试特征。

PHPUnit has a method getMockForTrait 将返回一个使用该特征的对象。然后您可以测试特征函数。

这是文档中的示例:

<?php
trait AbstractTrait

    public function concreteMethod()
    
        return $this->abstractMethod();
    

    public abstract function abstractMethod();


class TraitClassTest extends PHPUnit_Framework_TestCase

    public function testConcreteMethod()
    
        $mock = $this->getMockForTrait('AbstractTrait');

        $mock->expects($this->any())
             ->method('abstractMethod')
             ->will($this->returnValue(TRUE));

        $this->assertTrue($mock->concreteMethod());
    

?>

【讨论】:

【参考方案2】:

您也可以使用 getObjectForTrait ,然后根据需要断言实际结果。

class YourTraitTest extends TestCase

    public function testGetQueueConfigFactoryWillCreateConfig()
    
        $obj = $this->getObjectForTrait(YourTrait::class);

        $config = $obj->getQueueConfigFactory();

        $this->assertInstanceOf(QueueConfigFactory::class, $config);
    

    public function testGetQueueServiceWithoutInstanceWillCreateConfig()
    
        $obj = $this->getObjectForTrait(YourTrait::class);

        $service = $obj->getQueueService();

        $this->assertInstanceOf(QueueService::class, $service);
    

【讨论】:

以上是关于如何对 PHP 特征进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 EntityType 字段对 Symfony 4 表单进行单元测试

PHPstorm配置PHPunit对composer引入的php代码进行单元测试

如何对 Symfony2 控制器进行单元测试?

对网站进行单元测试

如何使用 Doctrine Fixture 加载测试数据库进行 PHP 单元测试?

使用闭包进行 PHP 单元测试