Вызов модуля-модуля внутри объекта - PullRequest
0 голосов
/ 04 января 2019

У меня есть следующий код

@mock.patch('src.sql_connector.SqlWorkflowConnector')
def mock_workflow_connector(mock_connector):
    mock_connector.return_value.get_connection.return_value = MagicMock()
    mock_connector.return_value.get_cursor.return_value = MagicMock()
    return mock_connector

@mock.patch('src.sql_connector.SqlOverlordConnector')
def mock_overlord_connector(mock_connector):
    mock_connector.return_value.get_connection.return_value = MagicMock()
    mock_connector.return_value.get_cursor.return_value = MagicMock()
    return mock_connector

@mock.patch('src.sql_scrapper.SqlScrapper')
def test_retrieve_metadata(mock_sql_scrapper):
    sql_workflow_connector = mock_workflow_connector()
    sql_overlord_connector = mock_overlord_connector()
    scrapper = SqlScrapper(sql_workflow_connector, sql_overlord_connector)
    data = scrapper.retrieve_metadata("test_sample", "test_id", "test_status")
    print(data)

В моей функции test_retrieve_meta_data у меня есть следующая строка

data = scrapper.retrieve_metadata("test_sample", "test_id", "test_status")

Вызывает cursor.execute () вызов

возвращаемое значение, которое я получаю

<MagicMock name='mock.cursor.execute()' id='4471052104'>
{'sample_name': <MagicMock name='mock.cursor.execute().SampleName' id='4471062824'>}

Я бы хотел иметь возможность исправить это возвращаемое значение, чтобы продолжить тестирование с ним

Как мне поменять mock.cursor.execute (). Вызов SampleName для возврата, например, "test_sample"?

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Исходя из отклика хифлинга, я смог изменить и внести коррективы. Приведенный выше пример не работает должным образом.

Решение выглядит следующим образом

@mock.patch('src.sql_connector.SqlWorkflowConnector')
def mock_workflow_connector(mock_connector):
    mock_connector.return_value.get_connection.return_value = MagicMock()
    mocked_cursor = MagicMock()
    mocked_cursor.execute.return_value.SampleName = 'test_sample_name'
    mocked_cursor.execute.return_value.ClientSampleId = 'test_client_sample_id'
    mocked_cursor.execute.return_value.ClientSubjectId = 'test_client_subject_id'
    mocked_cursor.execute.return_value.ClientName = 'test_client_name'
    mocked_cursor.execute.return_value.ProjectId = 'test_project_id'
    mocked_cursor.execute.return_value.ProjectName= 'test_project_name'
    mocked_cursor.execute.return_value.WorkflowExecutionId = 12345
    mock_connector.return_value.get_cursor.return_value = mocked_cursor
    print(mock_connector.return_value.get_cursor.return_value)
    mock_connector.cursor = mocked_cursor
    return mock_connector

@mock.patch('src.sql_connector.SqlOverlordConnector')
def mock_overlord_connector(mock_connector):
    mock_connector.return_value.get_connection.return_value = MagicMock()
    mock_connector.return_value.get_cursor.return_value = MagicMock()
    return mock_connector

def test_retrieve_metadata(t_row):
    sql_workflow_connector = mock_workflow_connector()
    sql_overlord_connector = mock_overlord_connector()
    scrapper = SqlScrapper(sql_workflow_connector, sql_overlord_connector)
    data = scrapper.retrieve_metadata("test_sample", "test_id", "test_status")
    print(data)
    print(t_row)
    assert data == t_row
0 голосов
/ 06 января 2019

Во-первых, я подозреваю, что в вашем текущем использовании издевательств есть ошибка. Вы исправляете классы SqlWorkflowConnector и SqlOverlordConnector, поэтому return mock_connector вернет макет для class и sql_workflow_connector / sql_overlord_connector - оба макета для классов. Ваш SqlScrapper действительно ожидает классы в конструкторе? Скорее всего, они должны быть экземплярами:

scrapper = SqlScrapper(sql_workflow_connector(), sql_overlord_connector())

Чтобы избежать неоднозначностей, я обычно называю фиктивные функции суффиксами _cls / _instance, поэтому я всегда могу вспомнить, что заменяет возвращенный имитатор. Например,

def mock_workflow_connector_cls(mock_connector):
    ...

Во-вторых, чтобы ответить на ваш актуальный вопрос: просто увеличьте объект, который у вас уже есть. Пример:

@mock.patch('spam.SqlWorkflowConnector')
def mock_workflow_connector(mock_connector):
    mock_connector.return_value.get_connection.return_value = MagicMock()
    mocked_cursor = MagicMock()
    mocked_cursor.execute.return_value.SampleName = 'test_sample'
    mock_connector.return_value.get_cursor.return_value = mocked_cursor
    return mock_connector
...