在Pytest中使用Mock类模拟Slack Web Client
测试依赖Slack WebClient的函数方案
问题背景
需要编写pytest测试用例,覆盖get_slack_id函数的两种场景:传入有效邮箱返回对应Slack ID,传入无效邮箱触发异常并返回异常对象,核心是用自定义MockWebClient替换函数中依赖的slack_sdk.WebClient实例。
待测试函数代码
import slack_sdk client = slack_sdk.WebClient(token="xxx") def get_slack_id(user_email): try: user_info = client.users_lookupByEmail(email=user_email) return user_info["user"]["id"] except Exception as e: return e
自定义Mock类代码
修正原代码中未定义变量和字符串缺失引号的问题:
# Mock Slack Api Error class SlackApiError(Exception): def __init__(self, error_message): self.error_message = error_message # Mock Slack Web Client class MockWebClient: def __init__(self): self.users = { "firstuser@email.com": {"id": "ID123456789", "name": "First User"}, "seconduser@email.com": {"id": "ID901234567", "name": "Second User"}, } self.messages = [] self.api_email_lookup_fail_message = "User not found via email lookup" def users_lookupByEmail(self, email): if email in self.users: return {"user": self.users[email]} else: raise SlackApiError(self.api_email_lookup_fail_message) def chat_postMessage(self, channel, text): for user in self.users.values(): if user["id"] == channel: self.messages.append({"channel": channel, "text": text}) return {"ok": True, "ts": "00000000.000000"} return {"ok": False, "error": "channel not found"}
pytest测试用例实现
测试有效邮箱返回正确Slack ID
使用monkeypatch替换全局client实例:
import pytest from your_module import get_slack_id # 替换为实际模块名 from your_mock_module import MockWebClient # 替换为Mock类所在模块名 def test_get_slack_id_valid_email(monkeypatch): mock_client = MockWebClient() monkeypatch.setattr("your_module.client", mock_client) result = get_slack_id("firstuser@email.com") assert result == "ID123456789" result = get_slack_id("seconduser@email.com") assert result == "ID901234567"
测试无效邮箱返回SlackApiError
def test_get_slack_id_invalid_email(monkeypatch): mock_client = MockWebClient() monkeypatch.setattr("your_module.client", mock_client) result = get_slack_id("nonexistent@email.com") assert isinstance(result, SlackApiError) assert result.error_message == "User not found via email lookup"
替代方案:使用unittest.mock.patch
如果偏好unittest.mock工具,可用装饰器替换client:
from unittest.mock import patch from your_module import get_slack_id from your_mock_module import MockWebClient @patch("your_module.client", new_callable=MockWebClient) def test_get_slack_id_valid_email_patch(mock_client): result = get_slack_id("firstuser@email.com") assert result == "ID123456789" @patch("your_module.client", new_callable=MockWebClient) def test_get_slack_id_invalid_email_patch(mock_client): result = get_slack_id("nonexistent@email.com") assert isinstance(result, SlackApiError) assert result.error_message == mock_client.api_email_lookup_fail_message
内容的提问来源于stack exchange,提问作者user16828857
相关产品推荐
相关产品推荐

