You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 13:51:29