2012-01-05 1 views
6

Le risposte sono in JSON e sto utilizzando un framework MVC personalizzato che non sono sicuro di come viene prodotto il processo di richiesta e risposta. I metodi di servizio vengono creati utilizzando la seguente sintassi.Un modo per usare PHPUnit per testare le richieste e le risposte API usando solo PHP?

public function getSessionsMethod() 
{ 
    // data auto encoded as JSON 
    return array('hello', 'world'); 
} 

Una richiesta da JavaScript sarebbe simile a questa /svc/api/getSessions. Il mio primo pensiero era quello di usare semplicemente un approccio di streaming. Ci sono le migliori pratiche per questa forma di test?

public function testCanGetSessionsForAGivenId() 
{ 
    $params = http_build_query(
     array(
      'id' => 3, 
     ) 
    ); 
    $options = array(
     'http' => array(
      'method' => 'GET', 
      'content' => $params, 
      ) 
     ); 
    $context = stream_context_create($options); 
    $response = file_get_contents(
     'http://vbates/svc/api/getSessions', false, $context 
    ); 
    $json  = json_decode($response); 
    $this->assertEquals(3, $json->response); 
} 
+0

Vedi anche: [Ho un'unità testata la mia classe, ora come faccio a iniziare con un test di integrazione?] (Http://stackoverflow.com/questions/8725879/ive-unit-tested-my-class -ora-how-do-i-get-iniziato-con-un-integrazione-test). – hakre

risposta

9

Questo non sembra unit testing a me, ma piuttosto integration testing. Puoi usare PHPUnit per farlo, ma prima dovresti capire la differenza.

Ci sono molti componenti necessari per avere la risposta per un determinato metodo di servizio:

  1. Il dispatcher: estratti i parametri della URL e invia al metodo di servizio appropriato.
  2. Il metodo di servizio: il vero lavoro da testare qui.
  3. Encoder JSON: trasforma il valore di ritorno del metodo di servizio in una risposta JSON.

Si consiglia di testarli singolarmente isolatamente. Una volta verificato che il dispatcher e il codificatore funzionano per URL generici e valori di ritorno, non c'è motivo di sprecare cicli di test che funzionano con ogni metodo di servizio.

Invece, concentrare l'attenzione sulla verifica di ciascun metodo di servizio senza coinvolgere questi altri componenti. Il tuo test case dovrebbe creare un'istanza e chiamare i metodi di servizio direttamente con vari input e fare asserzioni sui loro valori di ritorno. Ciò non richiederà solo uno sforzo minore da parte tua, ma renderà più semplici i problemi di localizzazione perché ogni errore sarà limitato a un singolo componente.

+0

Informazioni molto utili. Non conosco il funzionamento interno del framework personalizzato che sto usando, e non posso davvero prendermi il tempo di esaminarlo (nessuna documentazione). – ezraspectre

+1

@QuincyGlenn - Finché le classi create per mantenere i metodi di servizio possono essere istanziate al di fuori del framework, è possibile testarle come descritto. –