首页 > 解决方案 > 模拟通过构造函数创建的实例对象

问题描述

我有这个片段:

#jira_api.py
from jira import JIRA

class JiraApi:
    def __init__(self):
        username = os.environ.get("JIRA_USERNAME")
        api_token = os.environ.get("JIRA_TOKEN")

        options = {'server': 'https://mycompany.atlassian.net'}

        try:
            self.jira = JIRA(options=options, basic_auth=(username, api_token))
        except jira.exceptions.JIRAError:
            print("[ERROR] Unable to connect to JIRA with provided credentials.")
            sys.exit(1)

    def search(self, query):
      return self.jira.search_issues(query)

有没有办法可以修补这个构造函数,以便self.jira我自己的模拟对象的值?我想更换

self.jira = JIRA(options=options, basic_auth=(username, api_token))

如果可能的话,使用我自己的对象,以便构造函数实际上不会尝试连接到 API。我已经尝试了一些方法,特别是修补JIRA以返回我自己的模拟对象......但没有运气。

示例尝试

@pytest.fixture
def patched_jira_api(mocker):
    def _patched_jira_api(jira_issues):
        mocked_jira_client = mocker.MagicMock()
        mocked_jira_client.search_issues = mocker.MagicMock(return_value=jira_issues)

        return mocker.patch('jira_api.JIRA', return_value=mocked_jira_client)

    return _patched_jira_api

def test_jira_basics(patched_jira_api, mock_jira_issue):
    mock_issues = [
        mock_jira_issue(priority="P0"),
        mock_jira_issue(priority="P1")
    ]
    patched_jira_client(mock_issues)
    jira_api = JiraApi()

    assert jira_api.search(query='TEST') == mock_issues

我的目标是模拟self.jira.search_issues内置函数以返回我的mock_issues列表,但我的构造函数仍在尝试连接到真正的 JIRA 服务器。:(

任何帮助将不胜感激,谢谢。

更新:我尝试将模块名称更新为jira.pytojira_api.py以避免任何命名空间问题。但是,现在我在尝试修补时失败了:

    def _importer(target):
        components = target.split('.')
        import_path = components.pop(0)
>       thing = __import__(import_path)
E       ModuleNotFoundError: No module named 'jira_api'

标签: python-3.xpytest

解决方案


推荐阅读