Marcin Federowicz

Marcin Federowicz Morizon.pl - Od
wyszukania do
zamieszkania

Temat: phpunit - jak zasymulować puknięcie w api aby...

Witam

Mam następujący przypadek jest sobie controller Abc:


class AbcController extends Zend_Controller_Action
{
public function indexAction()
{
$uri = 'http://localhost/rest/api/dane'
$username = "Ala";
$password = "Kota";
$rest = new Zend_Rest_Client();
$restrequest = $rest->getHttpClient()
->setAuth($username,$password)
->setUri($uri)
->request('GET');
if ($restrequest->getStatus() == 200) {

//sukces mozemy wyswietlic dane
$result = $restrequest->getBody();
print $result;
}else{

//niepowodzenie brak danych lub api nie działa

}
}
}


Chciałbym napisać testy (przynajmniej dwa :)) aby można było zweryfikować poprawność działania metody indexAction(). Plik z testami wygląda mniej więcej tak:


<?php

require_once 'PHPUnit/Framework/TestCase.php';

class AbcControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{

public function setUp()
{
$this->bootstrap = array($this, 'appBootstrap');
parent::setUp();

}

public function appBootstrap()
{
$this->_application = new Zend_Application(APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);
$this->_application->bootstrap();

$front = Zend_Controller_Front::getInstance();

if ($front->getParam('bootstrap') === null) {
$front->setParam('bootstrap', $this->_application->getBootstrap());
}


}


public function tearDown()
{
/* Tear Down Routine */
}

public function testAbc_Index_Method()
{

$this->dispatch('/abc');

}


}


Wiem że powyższy test jest nie kompletny bo nie ma weryfikacji żadnych warunków, ale nie o to mi chodzi. Chodzi mi o to iż owszem powyższy test się wykona, ale podczas jego wykonywania nastąpi puknięcie z interfejs restowy a tego bym nie chciał (tzn chciałbym ale,chciałbym pukać w interfejs nie istniejący czyli taki który sobie stworze w momencie wykonywania testu). Wiem że jest cos takiego jak Mock'owanie obiektów ale taki zapis:


$this->dispatch('/abc');
$rest = $this->getMock('Zend_Rest_Client');
$restrequest = $rest
->getHttpClient()
->setAuth(USER_LOGIN, USER_LOGIN)
->setUri('http://localhost/rest/api/dane')
->request('GET');


Ani taki:


$rest = $this->getMock('Zend_Rest_Client');
$restrequest = $rest
->getHttpClient()
->setAuth(USER_LOGIN, USER_LOGIN)
->setUri('http://localhost/rest/api/dane')
->request('GET');
$this->dispatch('/abc');


Nie zadziała poprawnie ponieważ w obydwu przypadkach zostanie wykonana metoda indexAction() ale nie mam żadnego wpływu na wynik zwrócony z interfejsu restowego przez co nie będę mógł przetestować np przypadku gdy interfejs nie działa

Nigdzie nie mogę znaleźć rozwiązania powyższego problemu. Znalazłem owszem przykłady testowania samych zapytań do interfejsu i odpowiedzi, ale przypadku gdzie testowana by była metoda która w sobie ma puknięcie w inny interfejs nigdzie nie znalazłem.

Czy taka sytuacja jest możliwa w ogóle do przetestowania przy pomocy phpunit albo może gdzieś popełniam błąd?

Jestem otwarty na sugestie, podpowiedzi, krytyke :)Marcin Federowicz edytował(a) ten post dnia 24.04.11 o godzinie 23:50

konto usunięte

Temat: phpunit - jak zasymulować puknięcie w api aby...

Osobiście uważam, że testowanie kontrolerów jest pozbawione sensu. Głównie dlatego, że cała logika powinna być zawarta w warstwie modelu. Zwłaszcza logika pobrania danych. U Ciebie tego właśnie brakuje - masz wstawione na sztywno odwołanie do zewnętrznego webservice`u i ani tego nie skonfigurujesz, ani sensownie nie przetestujesz.
Proponuję przenieść niezbędną logikę do modelu i przygotować sobie możliwość wstrzykiwania argumentów (albo najlepiej - całego obiektu/mocka Zend_Rest_Client) - wtedy będziesz mógł testować do woli.
Inna sprawa, że z tego co widzę, próbujesz sprawdzić poprawność działania webservice`u, a nie do tego służą testy jednostkowe/integracyjne. Tutaj lepiej będzie zaprząc narzędzia do monitoringu (nagios, monit), które ostrzegą w przypadku problemów z zewnętrzną aplikacją.

PozdrawiamMichał Bachowski edytował(a) ten post dnia 25.04.11 o godzinie 17:56
Marcin Federowicz

Marcin Federowicz Morizon.pl - Od
wyszukania do
zamieszkania

Temat: phpunit - jak zasymulować puknięcie w api aby...

Hej dzięki za przytoczone sugestie. Sugerujesz aby zapytania do webservice'u przenieść do modelu a z poziomu controllera pobierac dane przy pomocy odpowiednio przygotowanych metod ?
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: phpunit - jak zasymulować puknięcie w api aby...

nie uzywaj $this->dispatch, stworz obiekt kontrolera, dodaj mu zmockowane request i response, uruchom akcje i pozniej masz dostep zarowno do response jak i widoku wiec latwiej to testowac
Marcin Federowicz

Marcin Federowicz Morizon.pl - Od
wyszukania do
zamieszkania

Temat: phpunit - jak zasymulować puknięcie w api aby...

Skoro nie używać $this->dispatch to w takim razie po co jest ta metoda skoro jest nie przydatna ?:)

A co myślicie o wykorzystaniu do tego celu:


$adapter = new Zend_Http_Client_Adapter_Test();
$client = new Zend_Http_Client('http://www.example.com', array(
'adapter' => $adapter
));

// Set the first expected response
$adapter->setResponse(
"HTTP/1.1 302 Found" . "\r\n" .
"Location: /" . "\r\n" .
"Content-Type: text/html" . "\r\n" .
"\r\n" .
'<html>' .
' <head><title>Moved</title></head>' .
' <body><p>This page has moved.</p></body>' .
'</html>');

// Set the next successive response
$adapter->addResponse(
"HTTP/1.1 200 OK" . "\r\n" .
"Content-Type: text/html" . "\r\n" .
"\r\n" .
'<html>' .
' <head><title>My Pet Store Home Page</title></head>' .
' <body><p>...</p></body>' .
'</html>');

Następna dyskusja:

ZF2 Advanced Structure with...




Wyślij zaproszenie do