Wie man PHP-Merkmale testet

Lesezeit: 2 Minuten

Benutzer-Avatar
Ali

Ich möchte wissen, ob es eine Lösung zum Unit-Testen eines PHP-Merkmals gibt.

Ich weiß, dass wir eine Klasse testen können, die das Merkmal verwendet, aber ich habe mich gefragt, ob es bessere Ansätze gibt.

Danke für jeden Tipp im Voraus 🙂

BEARBEITEN

Eine Alternative besteht darin, die Eigenschaft in der Testklasse selbst zu verwenden, wie ich unten demonstrieren werde.

Aber Ich bin nicht so begeistert von diesem Ansatz, da es keine Garantie dafür gibt, dass es keine ähnlichen Methodennamen zwischen dem Merkmal, der Klasse und auch dem gibt PHPUnit_Framework_TestCase (in diesem Beispiel):

Hier ist ein Beispielmerkmal:

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;
    }
}

und seine Prüfung:

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');
    }
}

  • Bitte geben Sie Code an, mit dem Sie dies versucht haben und der nicht funktioniert. Das hilft jemandem, der dir hilft.

    – Adam B

    26. Juni 2015 um 23:00 Uhr

  • @AdamB, ich habe die erste Antwort selbst geschrieben, die einen Beispielcode enthält. Aber bitte beachten Sie, dass es nicht so ist, als wäre etwas kaputt oder funktioniert nicht. Ich möchte nur wissen, ob es gute Methoden gibt, um Eigenschaften direkt und nicht indirekt durch Einheitentests einer Klasse zu testen, die diese Eigenschaft verwendet. Panzer

    – Ali

    26. Juni 2015 um 23:18 Uhr


Benutzer-Avatar
Schleis

Sie können eine Eigenschaft auf ähnliche Weise testen wie die konkreten Methoden einer abstrakten Klasse.

PHPUnit hat eine Methode getMockForTrait die ein Objekt zurückgibt, das die Eigenschaft verwendet. Dann können Sie die Traits-Funktionen testen.

Hier ist das Beispiel aus der Dokumentation:

<?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());
    }
}
?>

Sie können auch verwenden getObjectForTrait bestätigen Sie dann das tatsächliche Ergebnis, wenn Sie möchten.

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);
    }
}

Seit PHP 7 können wir nun anonyme Klassen verwenden…

$class = new class {
    use TheTraitToTest;
};

// We now have everything available to test using $class

1335310cookie-checkWie man PHP-Merkmale testet

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy