2010-12-18 20 views
5

Podejrzewam PHPUnit pokazuje, że 1 linia kodu nie jest objęta testów jednostkowych z powodu wyjątków ów rzucony (ale złapałem)PHPUnit Code Coverage & Wyjątki

mam badanej jednostki, która powinna obejmować linia

/** 
* @expectedException Doctrine\ORM\NoResultException 
*/ 
public function testCannotLoginInvalidUser() { 

    $user = User::login($this->em, 'nonExistant', 'password'); 
    $this->assertNull($user); 

} 

Dlaczego mój zasięg kodu nadal odzwierciedla to, co nie jest objęte gwarancją?

Zrobiłem test ... dodane echo b4 zawracania zerowa ... Okazało się, że ta linia jest naprawdę nie objętych ...

try { 
    $user = $query->getSingleResult(); 
} catch (Exception $e) { 
    echo 'caught exception'; <-- this does not get executed. 
    return null; 
} 

Czy PHPUnit omijając wszystkie wykonanie raz jest wyjątek?

UPDATE: Mam wrażenie, że używam @expectedException złego tho ...

+0

jest twój kalendarz „login” metoda wewnątrz przestrzeni nazw? –

+0

@Anti Veeranna, Tak, jest w 'Application \ Models'. Czy znajdowanie się w przestrzeni nazw niczego nie zmienia? –

Odpowiedz

4

Twoje próbki kodu to tylko wierzchołek góry lodowej, trudno jest wskazać dokładnie problem.

Ale jeden szczegół wydaje się podejrzane mnie: skoro metoda logowania w aplikacji \ Models następnie poniższy kod

try { 
    $user = $query->getSingleResult(); 
} catch (Exception $e) { 

nie złapie żadnego wyjątku, to złapać \ Application \ Modele \ Wyjątek - jeśli masz nawet zdefiniowaną taką klasę.

Może to jest przyczyną, dla której twój program obsługi wyjątku nie działa.

+1

O ile się nie mylę, rozwiązaniem jest zmiana klasy wyjątku na '\ Exception', aby przechwycić wszystkie typy wyjątków. –

2

@expectedException Adnotacja jest podobna do tej testcode:

public function testDoStuff() { 
    try { 
     doStuff(); 
    } catch(Exception $e) { 
     // Test passed 
     return; 
    } 
    $this->fail("Exception not thrown, test failed !"); 
} 

więc nie może (nie powinien) Test dwie rzeczy na raz w tym TESTCASE. (Jeśli zostanie zgłoszony wyjątek ORAZ wartość zwracana)

Jeśli chcesz przetestować, że User::login zgłasza wyjątek, dobrze jest wybrać tę wersję testową, a asercja nie jest potrzebna (kod ten nie jest nigdy wykonywany :))

Do get the red line covered trzeba napisać kod, więc $ query-> getSingleResult() zgłasza wyjątek. To może być trudne, ale ponieważ nie widzę wystarczającej ilości źródła (np. Skąd pochodzi obiekt zapytania), nie mogę tu być specyficzne.

Jeśli obiekt $ zapytanie jest fałszywa niech to wyjątek na -> getSingleResult i napisać testcase sprawdzanie „null”

Powiązane problemy