2016-04-11 4 views
0

Я пишу модульные тесты для проверки моих функциональных возможностей проекта. Мне нужно заменить некоторые функции функцией mock, и я подумал использовать библиотеку Python mock. Реализация, которую я использовал, кажется, не работает должным образом, хотя я не понимаю, где я делаю неправильно. Вот упрощенный вариант:Python: проблема со встроенной функцией fock

корень/connector.py

from ftp_utils.py import * 

def main(): 
    config = yaml.safe_load("vendor_sftp.yaml") 
    downloaded_files = [] 

    downloaded_files = get_files(config) 
    for f in downloaded_files: 
     #do something 

корень/Utils/ftp_utils.py

import os 
import sys 
import pysftp 

def get_files(config): 
    sftp = pysftp.Connection(config['host'], username=config['username']) 
    sftp.chdir(config['remote_dir']) 
    down_files = sftp.listdir() 
    if down_files is not None: 
    for f in down_files: 
     sftp.get(f, os.path.join(config['local_dir'], f), preserve_mtime=True) 

    return down_files 

корень/тесты/connector_tester.py

import unittest 
import mock 
import ftp_utils 
import connector 

def get_mock_files(): 
    return ['digital_spend.csv', 'tv_spend.csv'] 

class ConnectorTester(unittest.TestCase) 
    @mock.patch('ftp_utils.get_files', side_effect=get_mock_files) 
    def test_main_process(self, get_mock_files_function): 
    # I want to use a mock version of the get_files function 
    connector.main() 

Когда я отлаживаю свой тест, я ожидаю, что функция get_files, вызванная внутри main.connect, является get_mock_files(), но вместо этого является ftp_utils.get_files(). Что я здесь делаю неправильно? Что я должен изменить в своем коде, чтобы правильно вызвать get_mock_file() mock?

Спасибо, Alessio

ответ

1

Я думаю, что есть некоторые проблемы с вашим сценарием:

  • connector.py не может импортировать из ftp_utils.py, что путь
  • и не может connector_tester.py
  • как привычка, это лучше иметь файлы для тестирования по форме test_xxx.py
  • использовать unittest с заплатами, см this example

В общем, старается обеспечить минимальные работать примеры так, что легче для всех, чтобы запустить свой код.

Я изменил довольно сильно ваш пример, чтобы заставить его работать, но в основном, проблема заключается в том, что вы залатать 'ftp_utils.get_files' пока это не ссылка, что на самом деле называется внутри connector.main(), но, вероятно, довольно 'connector.get_files'.

Вот каталог видоизмененного примера в:

test_connector.py 
ftp_utils.py 
connector.py 

test_connector.py:

import unittest 
import sys 
import mock 
import connector 

def get_mock_files(*args, **kwargs): 
    return ['digital_spend.csv', 'tv_spend.csv'] 

class ConnectorTester(unittest.TestCase): 
    def setUp(self): 
     self.patcher = mock.patch('connector.get_files', side_effect=get_mock_files) 
     self.patcher.start() 

    def test_main_process(self): 
     # I want to use a mock version of the get_files function 
     connector.main() 

suite = unittest.TestLoader().loadTestsFromTestCase(ConnectorTester) 

if __name__ == "__main__": 
    unittest.main() 

NB: что называется при запуске connector.main() является 'connector.get_files'

connector.py:

from ftp_utils import * 

def main(): 
    config = None 
    downloaded_files = [] 
    downloaded_files = get_files(config) 
    for f in downloaded_files: 
     print(f) 

коннектор/ftp_utils.py без изменений.

+0

благодарит за отзыв. Я указал, что это упрощенная версия, извиниться, если я не уточню дальше. Зачем нам нужен другой модуль (content.py)?Это не очень прямолинейно и требует некоторой работы. Не могли бы вы указать, что было не так в моем примере? – AlessioG

+0

Как я уже сказал, ваш пример не может работать, так как все импортные данные недействительны ... поэтому я не могу сказать вам, что не так ... В принципе, если у вас есть версия, где импорт правильный на вашем компьютере, вам нужно изменить '' 'ftp_utils.get_files''' на правильный путь к функции, когда она вызывается в '' connector.main() '', вероятно, что-то вроде '' connector.ftp_utils.get_files'' ... Но если ваша папка выглядит так, как вы дали в примере, вы ** действительно ** должны рассмотреть возможность реструктуризации! – Silmathoron

+1

Хорошо, если вы не хотите использовать полный модуль, я редактировал примеры со всеми файлами в той же папке (тот факт, что вы использовали папку в примере, заставило меня подумать, что это было то, что у вас было на вашем компьютере) , Идея исправить код состоит в том, что если вы импортируете '' get_files'' в '' connector.py'', вам нужно исправить '' 'connector.get_files'''. – Silmathoron

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