2014-07-01 9 views
7

Obecnie próbuję wyszydzić metodę open() wbudowaną w Pythonie dla testu. Jednak ja zawsze kończy się coraz awarię i ten wynikający wiadomość:AttributeError: __exit__ kiedy próbuję wyśmiewać funkcje kompilacji

File "/opt/home/venv/lib/python2.7/site-packages/nose-1.3.0-py2.7.egg/nose/result.py", line 187, in _exc_info_to_string 
return _TextTestResult._exc_info_to_string(self, err, test) 
File "/opt/python-2.7.3/lib/python2.7/unittest/result.py", line 164, in _exc_info_to_string 
msgLines = traceback.format_exception(exctype, value, tb) 
File "/opt/python-2.7.3/lib/python2.7/traceback.py", line 141, in format_exception 
list = list + format_tb(tb, limit) 
File "/opt/python-2.7.3/lib/python2.7/traceback.py", line 76, in format_tb 
return format_list(extract_tb(tb, limit)) 
    File "/opt/python-2.7.3/lib/python2.7/traceback.py", line 101, in extract_tb 
line = linecache.getline(filename, lineno, f.f_globals) 
    File "/opt/home/venv/lib/python2.7/linecache.py", line 14, in getline 
lines = getlines(filename, module_globals) 
File "/opt/home/venv/lib/python2.7/linecache.py", line 40, in getlines 
return updatecache(filename, module_globals) 
File "/opt/home/venv/lib/python2.7/linecache.py", line 127, in updatecache 
with open(fullname, 'rU') as fp: 
AttributeError: __exit__ 

Tu jest mój kodu testu:

m = mox.Mox() 
m.StubOutWithMock(__builtin__, 'open') 
mock_file = m.CreateMock(__builtin__.file) 

open(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn(mock_file) 
mock_file.write(mox.IgnoreArg()).MultipleTimes() 
mock_file.close() 

write_file_method() 

Odpowiedz

4

__exit__ jest metoda, która jest wywoływana podczas próby zamknięcia pliku. Twój fałszywy plik nie obsługuje mock_file.close(), tylko open(). Będziesz także musiał kpić z metody close.


Edit:

Na drugie jednak, dlaczego chcesz szydzić open? AFAIK nie powinieneś robić tej metody. Testowana metoda powinna przyjmować strumień otwarty (na przykład zamiast nazwy pliku). W kodzie produkcyjnym klienci są odpowiedzialni za otwarcie pliku (np. pickle.dump). W twoich testach podajesz StringIO lub fałszywy obiekt obsługujący pisanie.


Edit 2: chciałbym podzielić na dwie metody i przetestować każdy bit osobno.

  • tworzenie pliku: sprawdź, czy przed wywołaniem tej metody plik nie istnieje i robi to później. Można argumentować, że taka jednolinijkowa metoda nie jest warta testowania.
  • zapisywanie do pliku: patrz wyżej. Utwórz StringIO i napisz do tego, aby twoje testy mogły następnie zweryfikować, czy napisano właściwą rzecz.
+0

Więc dodaję wiersz z napisem m.StubOutWithMock (__ builtin__, 'close')? Próbowałem, ale mam ten sam błąd, chyba że umieściłem go w niewłaściwym miejscu (zaraz po m.StubOut 'open') – user2253332

+0

Proszę zobaczyć zaktualizowaną odpowiedź – mbatchkarov

+0

Metoda, którą chcę przetestować, tworzy plik i zapisuje do niego, więc nie należy przekazywać obiektu pliku ani niczego. Nie jestem pewien, jak inaczej to przetestować. – user2253332