2016-05-03 3 views
0

Я пытаюсь выполнить тестирование тестового класса SFTP-помощника, который вызывает некоторые вызовы модуля pysftp. Я хочу высмеять фактические сетевые вызовы от pysftp, поэтому никаких побочных эффектов нет, и просто убедитесь, что класс правильно вызывает базовые методы SFTP с правильными параметрами.Откусывающий класс python в модульном тесте и проверка экземпляра

Вот простой пример моего кода до сих пор:

import pysftp 
import unittest 
import mock 

class SFTPHelper(object): 
    def __init__(self, host, username, password, files_dir): 
     self.host = host 
     self.username = username 
     self.password = password 
     self.files_dir = files_dir 

    def list_files(self): 
     with pysftp.Connection(
       self.host, 
       username=self.username, 
       password=self.password) as sftp: 
      return sftp.listdir(self.files_dir) 

class TestSFTPHelper(unittest.TestCase): 
    @mock.patch('pysftp.Connection') 
    def test_list_files(self, mock_connection): 
     sftp_helper = SFTPHelper('somehost', 'someuser', 'somepassword', '/some/files/dir') 
     sftp_helper.list_files() 

     # this assertion passes 
     mock_connection.assert_called_with(
      'somehost', password='somepassword', username='someuser') 

     # this assertion does not pass 
     mock_connection.listdir.assert_called_with('/some/files/dir') 

Ошибка утверждение:

AssertionError: Expected call: listdir('/some/files/dir') 
Not called 

Я предполагаю, что это не работает, потому что мне нужно, чтобы утверждать, что функция была вызвана на экземпляре, но как мне получить экземпляры pysftp.Connection, которые были использованы в моем методе?

+0

1. Можете ли вы дать более четкое описание проблемы, чем * "не работает" *? 2. Вы пытаетесь высмеять диспетчер * *, вы должны это прочитать. – jonrsharpe

+0

@jonrsharpe обновлено с ошибкой утверждения –

+0

@ dnit13 просто опечатка в вопросе stackoverflow, я делаю это в фактическом коде. исправлено –

ответ

1

Вы можете настроить макет, чтобы вернуть новый макет объекта с помощью методов __enter__ и __exit__. Например:

@mock.patch.object(
    target=pysftp, 
    attribute='Connection', 
    autospec=True, 
    return_value=mock.Mock(
     spec=pysftp.Connection, 
     __enter__=lambda self: self, 
     __exit__=lambda *args: None 
    ) 
) 
def test_list_files(self, mock_connection): 
    # (contents of test case) 

Кроме того, вы можете использовать:

mock_connection.return_value.listdir.assert_called_with('/some/files/dir') 

вместо:

mock_connection.listdir.assert_called_with('/some/files/dir') 

В качестве примечания, вы также можете заменить оба использования assert_called_with в ваш пример с assert_called_once_with.

Конечный результат:

$ python -m unittest test_sftp_helper.TestSFTPHelper.test_list_files 
. 
---------------------------------------------------------------------- 
Ran 1 test in 0.017s 

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