2016-11-23 4 views
1

У меня есть класс FilePlay, который принимает три параметра host_dic, PATH, group все со значениями по умолчанию. Когда host_dic предоставляется, экземпляр объекта создаст файл. Когда не задано, экземпляр объекта проверяет, существует ли файл, если он не вызывает ошибку. Вот код:Использовать unittest assertRaise() с экземпляром объекта

class FilePlay(object): 
    def __init__(self, host_dic=None, PATH='/foo/', group='bar'): 
     self.host_dic = host_dic 
     self.PATH = PATH 
     self.group = group # this changes with the instantiation 

     if isinstance(hosts_dic, dict): 
      # create a file 
      # change self.group 
     else: 
      if os.path.isfile(self.PATH+'hosts'): 
       # read the file 
       # change self.group 
      else: 
       raise IOError("Neither hosts file found nor host_dic parameter given, cannot instantiate.") 

Теперь я хотел бы проверить это с unittest. Итак, вот мой код:

import unittest 
from top.files import FilePlay 
import os.path 


class Test_FilePlay(unittest.TestCase): 

def test_init_PATH(self): 
    '''It tests FilePlay instatiation when: 
     PATH parameter is given 
    ''' 
    test_PATH='/foo/' 

    if not os.path.isfile(test_PATH+'hosts'): # If there is no hosts file at PATH location 
     self.assertRaises(IOError,play = FilePlay(PATH=test_PATH)) #Here is the problem! 
    else: # if there is the hosts file at PATH location 
     play = FilePlay(PATH=test_PATH) 

     self.assertEqual(play.group, 'bar') 
     self.assertEqual(play.hosts_dic, None) 

Когда я пытаюсь запустить тест с файлом в местоположении PATH, он работает нормально. Но когда файл НЕ присутствует, я получаю:

====================================================================== 
ERROR: test_init_PATH (top.tests.test_test_file) 
It tests FilePlay instatiation when: 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "top/tests/test_file.py", line 14, in test_init_PATH 
    self.assertRaises(IOError,play = FilePlay(PATH=test_PATH)) 
    File "top/ansible_shared.py", line 88, in __init__ 
    raise IOError("Neither hosts file found nor host_dic parameter given, cannot instantiate.") 
IOError: Neither hosts file found nor host_dic parameter given, cannot instantiate. 

---------------------------------------------------------------------- 
Ran 1 test in 0.001s 

FAILED (errors=1) 

Как пройти тест, если файл НЕ присутствует?

+1

Почему бы вам нужно присвоить имя, если вы звоните 'FilePlay 'вызывает исключение? Часть 'play =' не играет никакой роли. При вызове 'FilePlay' непосредственно исключение возникает до того, как вызывается метод' assertRaises() '. И не делайте свой тест условным на наличие файла. Проверьте оба сценария. –

+0

Спасибо за ваш комментарий. Пример действительно поможет .. – diegus

+0

У вас уже есть ответ. –

ответ

1

Вы не используете assertRaises правильно. Вы вызываете объект напрямую, так что ошибка возникает до того, как у утверждения появится возможность его захватить.

Вам нужно либо пройти класс сам и его параметры отдельно:

self.assertRaises(IOError, FilePlay, PATH=test_PATH) 

или использовать версию контекста менеджер:

with self.assertRaises(IOError): 
    FilePlay(PATH=test_PATH) 
+0

Спасибо, что работает отлично! Я не знаю о менеджере контекста. Я посмотрю – diegus

 Смежные вопросы

  • Нет связанных вопросов^_^