2016-03-19 16 views
4

Am Anfang möchte ich sagen - Ich bin neu in Komponententests in PHP (phpunit). In meinem neuen Projekt (slim3 framework) würde ich gerne meine Controller wie zB LoginController testen.Controller Einheit Test in slim3

Meine Idee ist (in Unit-Test-Methode)

  • erstellen Instanz LoginController
  • Mock einige Dienste in der Steuerung (DI)
  • Execute-Methode, die Antwort auf Anforderung (in meinem Controller Methode __invoke)

Mein Problem ist über Parameter für __invoke Methode. In Slim3 aufrufbar Verfahren zur Anfrage hat zwei ersten params:

RequestInterface $request und ResponseInterface $response

Wie kann ich diese Parameter in meiner Unit-Test-Klasse zu erstellen? Ich suchte nach einigen Beispielen für dieses Problem, aber ohne Erfolg.

Irgendwelche Vorschläge?

protected function requestFactory() 
{ 
    $uri = Uri::createFromString('https://example.com:443/foo/bar?abc=123'); 
    $headers = new Headers(); 
    $cookies = array(
     'user' => 'john', 
     'id' => '123', 
    ); 
    $env = Slim\Http\Environment::mock(); 
    $serverParams = $env->all(); 
    $body = new Body(fopen('php://temp', 'r+')); 
    $request = new Request('GET', $uri, $headers, $cookies, $serverParams, $body); 

    return $request; 
} 

Aber ich bin nicht sicher, das ist gut so:

Ich habe einige Code in Slim3 Tests Mock Anfrage gefunden.

Vielen Dank für jede Hilfe

Antwort

10

Ich schrieb hier eine Lösung gefunden: https://akrabat.com/testing-slim-framework-actions/

I Environment::mock() verwenden, um ein $request zu erstellen und dann kann ich die Aktion auszuführen. Jede Klasse aufrufbar zu machen, in der alle Abhängigkeiten in den Konstruktor eingefügt werden, macht das alles viel einfacher.

Im Wesentlichen sieht ein Test wie folgt aus:

class EchoActionTest extends \PHPUnit_Framework_TestCase 
{ 
    public function testGetRequestReturnsEcho() 
    { 
     // instantiate action 
     $action = new \App\Action\EchoAction(); 

     // We need a request and response object to invoke the action 
     $environment = \Slim\Http\Environment::mock([ 
      'REQUEST_METHOD' => 'GET', 
      'REQUEST_URI' => '/echo', 
      'QUERY_STRING'=>'foo=bar'] 
     ); 
     $request = \Slim\Http\Request::createFromEnvironment($environment); 
     $response = new \Slim\Http\Response(); 

     // run the controller action and test it 
     $response = $action($request, $response, []); 
     $this->assertSame((string)$response->getBody(), '{"foo":"bar"}'); 
    } 
} 
+0

Das funktionierte gut für mich! Danke @rob (Die Lösung, die auf Ihrer Website geschrieben wurde, war auch hilfreich) –

+0

Danke für diesen Code, @ rob-allen! Wie würden Sie vorschlagen, dass wir etwas Ähnliches tun, wenn unsere Routen durch anonyme Funktionen definiert sind? (Zum Beispiel: '$ app-> get ("/test/{id} ", Funktion ($ request, $ response, $ args) {...});') – rinogo

+0

Ich habe es herausgefunden. Für diejenigen, die neugierig sind, müssen Sie Ihre anonyme Funktion in eine benannte Funktion (z. B. "echo_action()") machen. Verwenden Sie dann anstelle von $ action = new \ App \ Action \ EchoAction(); '' $ action = "echo_action"; ' – rinogo

Verwandte Themen