2012-01-05 13 views
6

Odpowiedzi są w języku JSON i korzystam z niestandardowego schematu MVC, który nie jest pewny, w jaki sposób tworzony jest proces żądania i odpowiedzi. Metody serwisowe są tworzone przy użyciu następującej składni.Jakikolwiek sposób na użycie PHPUnit do testowania żądań i odpowiedzi API przy użyciu tylko PHP?

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

Wniosek z JavaScript wyglądałby następująco /svc/api/getSessions. Moja początkowa myśl polegała na tym, że po prostu korzystam z metody strumieniowej, czy istnieją najlepsze praktyki dla tej formy testowania?

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

Zobacz także: [Moja jednostka testowała moją klasę, teraz jak rozpocząć test integracji?] (Http://stackoverflow.com/questions/8725879/ive-unit-tested-my-class -now-how-do-i-get-started-with-an-integration-test). – hakre

Odpowiedz

9

To nie wygląda unit testing do mnie, ale raczej integration testing. Możesz użyć PHPUnit, aby to zrobić, ale powinieneś najpierw zrozumieć różnicę.

Istnieje wiele elementów zaangażowanych w uzyskaniu odpowiedzi na danej metody usługę:

  1. Dyspozytor: Ekstrakty parametry z adresu URL i wywołuje do odpowiedniej metody usługi.
  2. Metoda serwisowa: Czy prawdziwa praca ma zostać przetestowana tutaj.
  3. Koder JSON: Przekształca wartość zwracaną przez metodę usługi w odpowiedź JSON.

Powinieneś najpierw przetestować te indywidualnie w izolacji. Po sprawdzeniu, czy program rozsyłający i koder działają pod ogólnymi adresami URL i wartościami zwracanymi, nie ma sensu marnować testów cykli, które działają z każdą metodą usługi.

Zamiast tego skup się na testowaniu każdej metody serwisowej bez angażowania tych innych składników. Twój przypadek testowy powinien tworzyć instancję i wywoływać metody serwisowe bezpośrednio z różnymi wejściami i tworzyć asercje na ich wartościach zwracanych. Nie tylko będzie to wymagało mniejszego wysiłku ze strony użytkownika, ale ułatwi śledzenie problemów, ponieważ każda awaria będzie ograniczona do jednego komponentu.

+0

Bardzo pomocne informacje. Nie znam wewnętrznych aspektów niestandardowej struktury, której używam - i naprawdę nie mogę poświęcić czasu na jej przejrzenie (brak dokumentacji). – ezraspectre

+1

@QuincyGlenn - Tak długo, jak klasy stworzone do przechowywania metod serwisowych mogą być tworzone poza strukturą, możesz je przetestować zgodnie z opisem. –

Powiązane problemy