2016-06-02 16 views
0

Ich bin ein Neuling Entwickler versucht, eine Testsuite für eine bestehende Laravel App zu schreiben. Derzeit versuche ich, Tests für einen Controller zu schreiben, aber das verwendete Authentifizierungssystem ist seltsam implementiert und schwierig zu umgehen. Ich kann nicht einfach:PHP Aufruf einer Methode auf einer ReflectionClass

Ich muss den Controller instanziieren und eine private Eigenschaft in seiner Basisklasse festlegen. Um dies zu umgehen, versuche ich die Reflektion zu verwenden und die Konstruktoreigenschaften und die Benutzereigenschaft manuell einzustellen. Mein Problem tritt auf, wenn ich versuche, die Methode auf dem Reflexionsobjekt aufzurufen, und ich weiß nicht, wie ich es umgehen soll. Meine Testmethode:

public function testCount() 
{ 
    $user = \User::find(1); 
    $this->be($user); 

    $leadRepositoryInterface = m::mock('CRM\Storage\Lead\LeadRepositoryInterface'); 
    $response = m::mock('ColorJar\ApiResponse\Response'); 

    $leadsController = new ReflectionClass('LeadsController'); 

    $leadsControllerLead = $leadsController->getProperty('lead'); 
    $leadsControllerLead->setAccessible(true); 
    $leadsControllerResponse = $leadsController->getProperty('response'); 
    $leadsControllerResponse->setAccessible(true); 
    $leadsControllerCrmuser = $leadsController->getProperty('crmUser'); 
    $leadsControllerCrmuser->setAccessible(true); 

    $leadsControllerLead->setValue($leadsController, $leadRepositoryInterface); 
    $leadsControllerResponse->setValue($leadsController, $response); 
    $leadsControllerCrmuser->setValue($leadsController, $user); 

    $reflectionMethod = new ReflectionMethod('ReflectionClass', 'count'); 

    $this->assertEquals('jdsf', $reflectionMethod->invoke($leadsController)); 
} 

erzeugt die folgenden Fehler:

LeadsControllerTest::testCount 
ReflectionException: Method ReflectionClass::count() does not exist 

Ich weiß, dass ich rufe count() auf einer Instanz von Reflection statt LeadsController aber ich weiß nicht, wie sonst zu Legen Sie diese Eigenschaften fest, insbesondere crmUser, da es eine private Eigenschaft der Klasse ist, von der LeadsController erbt. Wie mache ich das?

+0

Sie sollten korrekte Klasse oder Objekt angeben: new ReflectionMethod ('ReflectionClass', 'count'); im Parameter 'ReflectionClass' –

+0

Das habe ich zuerst ausprobiert. Wenn ich dort 'LeadsController' liefere, erhalte ich den folgenden Fehler: ReflectionException: Gegebenes Objekt ist keine Instanz der Klasse, in der diese Methode deklariert wurde – brianfr82

+0

Versuchen Sie 'ReflectionClass' (string) zu $ ​​leadsController zu ersetzen –

Antwort

0

Sie sollten PHPUnit's Mock-Funktion verwenden.

https://phpunit.de/manual/current/en/test-doubles.html

Beispiel 9.7: ein Methodenaufruf Stubbing von einem Rückruf einen Wert zurückgeben

wird propably hilfreich sein, können Sie konfigurieren, was Ihr Anruf führen zu „zählen“ der Fall ist.

+0

Wirklich? Bist du sicher, dass ich mich über die Klasse lustig machen sollte, die ich gerade teste? – brianfr82

+0

Ja. Mit setMethods (array $ methods) können Sie entscheiden, welche Methoden tatsächlich ersetzt werden. Sie überschreiben einfach die Getter zu Ihren privaten Eigenschaften und konfigurieren, was sie zurückgeben würden. Wie '$ stub-> Methode ('count') -> willReturn (2);'. Wenn Sie wollen, werde ich meine Antwort mit einem Beispiel erweitern. – Fivetide

+0

@ brianfr82 Nein, du solltest es vermeiden, die Klasse zu verspotten, die du testest. Lesen Sie mehr über Testen in Laravel zuerst: https://laravel.com/docs/5.1/testing –

Verwandte Themen