2015-04-06 2 views
1

Я хочу протестировать appendRole, который называется getFileAsJson для чтения файла с открытым. Моя проблема в том, что я не знаю, какой из них будет дальше. Есть много if/elif.Mock в python 'open' из двух файлов

def appendRole(self, hosts=None, _newrole=None, newSubroles=None, undoRole=False, config_path=None): 
    """ Same as changeRole but keeps subroles """ 

    if hosts is None: 
     hosts = ["127.0.0.1"] 
    if newSubroles is None: 
     newSubroles = {} 
    if config_path is None: 
     config_path = self.config_path 


    with self._lock: 
     default = {} 
     data = self.getFileAsJson(config_path, default) 
     ................... 
     ................... 
     ................... 
     ................... 

     data1 = self.getFileAsJson(self.config_path_all, {"some"}) 
     data2 = self.getFileAsJson(self.config_path_core, {"something"}) 
     ................... 
     ................... 
     ................... 

def getFileAsJson(self, config_path, init_value): 
    """ 
     read file and return json data 
     if it wasn't create. Will created. 
    """ 
    self.createFile(config_path, init_value) 
    try: 
     with open(config_path, "r") as json_data: 
      data = json.load(json_data) 
     return data 
    except Exception as e: 
     self.logAndRaiseValueError(
      "Can't read data from %s because %s" % (config_path, e)) 

ответ

1

Даже вы можете найти ответ на свой вопрос в Python mock builtin 'open' in a class using two different files Я хотел бы призвать вас, чтобы изменить свой подход, чтобы писать тесты для getFileAsJson() и затем доверять его.

Чтобы проверить appendRole() использовать mock.patch залатать getFileAsJson(), затем side_effect атрибута вы можете поручить макет вернуться именно то, что вам нужно для вашего теста.

Итак, после некоторого испытания на getFileAsJson() где вы можете использовать mock_open() издеваться open встроенной команды (возможно, вам нужно пропатчить createFile() тоже). Ваш тест appendRole() выглядит примерно так:

@mock.patch('mymodule.getFileAsJson', autospec=True) 
def test_appendRole(self, mock_getFileAsJson) 
    mock_getFileAsJson.side_effect = [m_data, m_data1,m_data2,...] 
    # where m_data, m_data1,m_data2, ... is what is supposed 
    # getFileAsJson return in your test 
    # Invoke appendRole() to test it 
    appendRole(bla, bla) 
    # Now you can use mock_getFileAsJson.assert* family methods to 
    # check how your appendRole call it. 
    # Moreover add what you need to test in appendRole() 
Смежные вопросы