2010-01-14 15 views
10

Dane:Python - przetestować właściwość rzuca wyjątek

def test_to_check_exception_is_thrown(self): 
    # Arrange 
    c = Class() 
    # Act and Assert 
    self.assertRaises(NameError, c.do_something) 

Jeśli do_something zgłasza wyjątek testy przechodzi.

Ale mam właściwość, a po zamianie c.do_something na c.name = "Name" pojawia się błąd, że mój moduł testowy nie jest importowany, a Eclipse podświetla symbol równości.

Jak przetestować właściwość zgłasza wyjątek?

Edit:

setattr i getattr są dla mnie nowe. Z pewnością pomogły w tej sprawie, dzięki.

Odpowiedz

13

assertRaises oczekuje obiekt wywoływalny. Można utworzyć funkcję i przekazać go:

obj = Class() 
def setNameTest(): 
    obj.name = "Name"   
self.assertRaises(NameError, setNameTest) 

Inną możliwością jest użycie setattr:

self.assertRaises(NameError, setattr, obj, "name", "Name") 

Twój oryginalnego kodu podnosi błąd składni, ponieważ zadanie to stwierdzenie i nie mogą być umieszczone wewnątrz wyrażenia.

+2

Ponieważ python 2.7+ powinien sprawdzić odpowiedź @RaphaelAhrens poniżej. Jest o wiele więcej pythonic http: // stackoverflow.com/a/23650764/601245 –

-1

Otrzymujesz błąd, ponieważ jest to błąd składniowy w Pythonie, który ma przypisanie do innego wyrażenia. Na przykład:

>>> print(foo = 'bar') 
------------------------------------------------------------ 
    File "<ipython console>", line 1 
    print(foo = 'bar') 
      ^
SyntaxError: invalid syntax 

Ale robi to w dwóch etapach działa dobrze:

>>> foo = 'bar' 
>>> print(foo) 
bar 

Aby przetestować, że właściwość zgłasza wyjątek, użyj bloku try:

try: 
    object.property = 'error' 
except ExpectedError: 
    test_passes() 
else: 
    test_fails() 
+0

To jest przesada i nie pasuje do używania unittest. –

8

The second argument to assertRaises should be a callable.

Polecenie przypisania (tj. class.name = "Name") nie jest wywoływalne, więc nie zadziała. Użyj setattr wykonać zadanie jak tak

self.assertRaises(NameError, setattr, myclass, "name", "Name") 

Ponadto, nie można przypisać do class ponieważ jest to kluczowe.

+0

To był pseudo kod, aby odzwierciedlić mój kod. Ale wiem ;) – Finglas

10

Ponieważ Python 2.7 i 3.1 assertRaises() może być używany jako menedżer kontekstu. Zobacz here for Python 2 i here for Python3.

Więc można napisać test z instrukcją jak to with:

def test_to_check_exception_is_thrown(self): 
    c = Class() 
    with self.assertRaises(NameError): 
     c.name = "Name" 
0

Jak @interjay stwierdził, że spodziewa się callble, ale ou naprawdę nie trzeba zdefiniować funkcję o nazwie do tego, lambda zrobi to:

self.assertRaises(SomeException, lambda: my_instance.some_property) 
Powiązane problemy