So erstellen Sie Tests mit Doctrine-Entities, ohne diese beizubehalten (Festlegen der ID)

Ich arbeite an Tests für ein Symfony2-Projekt und suche derzeit nach einer Möglichkeit, Tests mit Entitätsobjekten zu erstellen, ohne diese zu speichern. Das Problem ist:Ich würde ist ein privates Feld und es gibt keinen Setter dafür. Ich kann ein neues Objekt erstellen und einige Eigenschaften festlegen, aber ich kann nichts testen, was damit zu tun hatgetId () Anrufe.

$entity = new TheEntity();
// Can't set ID!
$entity->setProperty('propertyValue');

$name = $entity->getProperty(); // OK
$id = $entity->getId(); // not OK - null

Die Vorsätze, die mir bekannt sind:

Initialisierung des gesamten Kernels (Symfony'sWebTestCase :: createKernel ()) und Fortbestehen der EntitätenErstellen eines Scheinobjekts für jede Entität, das eine gültige ID zurückgibtHacks wie statische Methode inDie Einheit Klasse, die ein initialisiertes Objekt zurückgibt oder Setter für hinzufügtIch würde Feld

Was ist der empfohlene Weg, um damit umzugehen, wie man eine Entität zum sauberen und schnellen Testen mit festgelegter ID erhält?

Bearbeiten

Es stellte sich heraus, dass ich das durch Verspotten lösen kann ... Entschuldigung, ich lerne noch. Ich war auf der Suche nach einem sauberen, standardmäßigen und dennoch schnellen Weg, um Dinge zu erledigen. Allerdings habe ich den zweiten Parameter von vergessengetMock() - das istIch muss nicht jede Methode der Entität verspotten, die ich verwenden werde. Ich wollte mehrere vermeiden->expects()->method()->will() usw. Und dies wird erreicht durch Hinzufügen von:array('getId'). Diese Hilfsmethode löst das Problem:

protected function getEntityMock($entityClass, $id)
{
    $entityMock = $this->getMock($entityClass, array('getId'));
    $entityMock
            ->expects($this->any())
            ->method('getId')
            ->will($this->returnValue($id));

    return $entityMock;
}

Wenn Sie mehrere Entitäten derselben Klasse erstellen, können Sie die Dinge natürlich durch weitere Hilfsmethoden wie die folgende vereinfachen:

protected function getTheEntityMock($id)
{
    return $this->getEntityMock('\The\NameSpace\TheEntity', $id);
}

Das einzigeVerjährung ist, dass die Entität selbst nicht verwenden kannid Eigentum, nurgetId() Getter.

Jede wertvolle Eingabe ist immer noch willkommen, aber ich glaube, PHPUnitgetMock() das gut gelöst.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage