【问题标题】:How to mock library class for Pytest如何模拟 Pytest 的库类
【发布时间】:2018-12-12 18:18:11
【问题描述】:

我是 python 代码的模拟和测试新手(无论是什么代码)。

我正在尝试测试我的函数 main.py

def get_channel_list():
    sc = SlackClient(get_token())
    channels_list_json = sc.api_call("channels.list")
    if channels_list_json['ok'] == True:
        return channels_list_json

这是我正在尝试测试的功能

我需要模拟补丁 sc.api_call("channels.list") 以返回 JSON 对象 但我找不到任何这样的例子可以帮助我弄清楚如何去做。

我发现的一切都像这个例子Mocking a class method...

我认为应该是这样的:

@patch.object(SlackClient, 'api_call')
def test_get_channel_list():
    assert get_channel_list() != ""

我不必测试 lib 我需要在我之前提到的函数中测试我的其余代码。 感谢您的帮助,我对这个测试非常满意。

【问题讨论】:

  • 我认为您需要编写一个模拟函数来返回 json 并在 patch 装饰器中提及它。如果您添加模拟功能,我们可能无法为您拼凑部分。
  • 我没完全明白你的意思
  • 你需要一些东西来“返回 json 对象”——你没有包含在问题中。我可以编造一些东西 - 但想知道是否有比你没有提到的更具体的东西。
  • 返回什么并不重要,它可能只是 python dict

标签: python mocking pytest


【解决方案1】:

您需要编写一个单独的模拟函数来返回一个 JSON 对象。

你可以试试这个:

@pytest.fixture
def mock_api_call(monkeypatch):
    monkeypatch.setattr(SlackClient, 'api_call', lambda self, arg: {"ok": True})

def test(mock_api_call):
    sc = SlackClient(get_token())
    channels_list_json = sc.api_call("channels.list")
    assert True == channels_list_json['ok']

def test_get_channel_list(mock_api_call):
    channels_list_json = get_channels_list()
    assert dict == type(channels_list_json)

【讨论】:

  • 非常感谢,这个回答对我有帮助
猜你喜欢
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
相关资源
最近更新 更多