2016-03-19 22 views
4

Başta şunu söylemek isterim - PHP'de ünite testinde yeniyim (phpunit). Yeni projemde (slim3 framework) Denetleyicileri örneğin LoginController gibi test etmek istiyorum.Denetleyici birim testi, thin3

Benim fikir (birim testi yöntemi)

  • kontrolörde LoginController
  • Mock bazı hizmetlerin örneği oluşturma (DI)
  • benim denetleyicileri yöntemde __invoke istek için yanıt (bir yöntemi Yürütme

Sorunum, __invoke yöntemiyle ilgili parametrelerle ilgilidir.

RequestInterface $request ve ResponseInterface $response

nasıl birim test sınıfında bu parametreler oluşturabilirsiniz: istek için Slim3 çağrılabilir yöntemde iki birinci params vardır? Bu konuyla ilgili bazı örnekleri araştırıyordum ama başarılı olamadım.

Herhangi bir öneriniz var mı?

Ben sahte isteğine Slim3 testlerinde bazı kod buldum:

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

Ama bu iyi bir yoldur emin değilim. https://akrabat.com/testing-slim-framework-actions/

Ben $request oluşturmak için Environment::mock() kullanmak ve sonra eylemi çalıştırabilirsiniz: herhangi bir yardım

cevap

10

için

Teşekkür Burada bir çözüm belirtilmiş. Her bir rotayı yapmak, tüm bağımlılıkların yapıcıya enjekte edildiği bir sınıfı kalbine alabilir ve bunu da çok daha kolay hale getirir.

Esasen, bir test şuna benzer:

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

Bu benim için çok çalıştı! Teşekkürler @rob (Web sitenize çözüm yazınız da yardımcı oldu) –

+0

Bu kod için teşekkürler, @ rob-allen! Rotalarımız anonim işlevlerle tanımlanmışsa benzer bir şeyi nasıl yapmamızı önerirsiniz? (Örneğin: $ app-> olsun ("/ test/{id}", işlev ($ request, $ response, $ args) {...}); ') – rinogo

+0

Bunu çözdüm. Merak edenler için, anonim işlevinizi adlandırılmış bir işleve (ör. "Echo_action()") yapmanız gerekir. Ardından, $ action = new \ App \ Action \ EchoAction(); 'yerine,' $ action = "echo_action" işlevini kullanın; – rinogo