2012-10-11 18 views
7

Obecnie piszę testy jednostek dla biblioteki, po refactoring logiki biznesowej z danych, jestem teraz w nieco zagmatwany stan nad tym, jak teraz przetestować logikę!Najlepsze metody dostarczania danych - PHPUnit

Na przykład, mam dość złożony proces, przez który przechodzi szereg danych, zamierzam użyć do tego dostawcy danych, aby upewnić się, że będzie on działał we wszystkich przypadkach.

Z danymi, które zamierzam przekazać za pośrednictwem dostawcy danych, czy powinienem również przekazać oczekiwany wynik? Lub czy należy to obliczyć w teście.

Jak wspomniano, proces obliczania jest dość skomplikowanym procesem, niezupełnie $a + $b.

Odpowiedz

7

Dostarczam również dostawcom danych oczekiwanego rezultatu. Ponieważ chcę, aby metoda pobierała dane wejściowe i zwracała wartość, nie chcę dwukrotnie wykonywać obliczeń, ponieważ jedna z implementacji może zawierać błąd.

Nie zamierzam używać sztuczek, ponieważ faktycznie testuję metody/funkcje, o których mowa.

Jeśli obliczamy coś na podstawie 4 parametrów, mój dostawca danych przejdzie 5. Pierwszy parametr to oczekiwany wynik, a następnie parametry, które należy przekazać do metody/funkcji.

Z tego, moja rozmowa jest całkiem prosta:

public static function GetRemoteAddressFromWebServerDataProvider() 
{ 
    return array(
     array('127.0.0.1', NULL,   '127.0.0.1'), 
     array('127.0.0.1', '127.0.0.1', NULL), 
     ); 
} 

/** 
* @dataProvider GetRemoteAddressFromWebServerDataProvider 
*/ 
public function testGetRemoteAddressFromWebServer($Result, $HTTPXSetting, $RemoteAddress) 
{ 
    $_SERVER['HTTP_X_FORWARDED_FOR'] = $HTTPXSetting; 
    $_SERVER['REMOTE_ADDR']   = $RemoteAddress; 
    $this->assertEquals($Result, GetRemoteAddressFromWebServer()); 
} 
+2

Jeszcze gorzej, jeśli dwukrotnie wdrożysz logikę, OBU implementacji może mieć błąd SAM. –

8

Aby przedłużyć przykład Stevena, może być czasami pomocne podać nazwę dla każdego zestawu danych. Gdy się nie powiedzie, PHPUnit wyświetli swoją nazwę zamiast "danych # 0" w komunikacie o błędzie.

public static function GetRemoteAddressFromWebServerDataProvider() 
{ 
    return array(
     'not forwarded' => array('127.0.0.1', NULL,   '127.0.0.1'), 
     'no remote address' => array('127.0.0.1', '127.0.0.1', NULL), 
    ); 
} 
+1

Dzięki. Dobrze wiedzieć, ponieważ nie używałem tych nazw. Czas na refaktoryzację niektórych testów. –

Powiązane problemy