如何利用pytest实现继承自ClientLibrary的Client类的模拟测试?含fixtures方案咨询
用Pytest Fixture优化Client类的测试方案
之前你用继承Client创建MockClient的方式,在测试隐式创建Client的场景时确实容易卡壳——因为代码里如果直接调用原Client(),你的MockClient根本没法替换掉这些调用。下面给你一套用pytest fixture结合mock的方案,能完美覆盖你提到的两类测试场景:
先准备核心Fixture
我们先定义两个fixture,分别对应显式创建和隐式创建的场景:
import pytest from unittest.mock import patch from your_module import Client, MOCK_HOST, MOCK_PORT # 替换成你的实际模块名 # 给显式创建场景用的fixture:直接返回连接测试服务器的Client实例 @pytest.fixture def test_client(): return Client(hosts=[{'host': MOCK_HOST, 'port': MOCK_PORT}]) # 给隐式创建场景用的fixture:patch掉模块中的Client类,让所有调用都返回测试服务器实例 @pytest.fixture def patched_client(): with patch('your_module.Client') as mock_cls: # 创建测试用的Client实例 test_instance = Client(hosts=[{'host': MOCK_HOST, 'port': MOCK_PORT}]) # 让每次调用Client()都返回这个测试实例 mock_cls.return_value = test_instance yield mock_cls
场景1:显式创建Client的测试
这个场景很直接,直接注入test_client fixture就行,不用再手动创建Client:
class TestFunctionThatUtilisesClient: def test_in_which_class_is_constructed_explicitly(self, test_client): # 直接用fixture提供的测试服务器Client r = test_client.some_method() assert r == 'something'
场景2:隐式创建Client的测试
这个场景用patched_client fixture,它会帮你把模块里所有Client()的调用都替换成测试服务器的实例,不管another_method内部怎么创建Client,都会用我们指定的测试地址:
def test_in_which_class_is_constructed_implicitly(self, patched_client): r = another_method() # 内部的Client()已经被替换成测试实例 assert r == 'something else' # 还可以额外验证Client是否被正确调用(可选) patched_client.assert_called_once_with()
额外优化:如果不想真的连接测试服务器
要是你只是想验证逻辑,不想真的发起连接,可以在fixture里mock掉some_method的返回值:
@pytest.fixture def mocked_client(): # 创建Client实例但mock掉方法 client = Client(hosts=[{'host': MOCK_HOST, 'port': MOCK_PORT}]) with patch.object(client, 'some_method') as mock_some_method: mock_some_method.return_value = 'something' yield client, mock_some_method # 用这个fixture的测试示例 def test_with_mocked_method(mocked_client): client, mock_method = mocked_client result = client.some_method() assert result == 'something' mock_method.assert_called_once()
这个方案比你之前的继承方式灵活多了,不管是显式还是隐式创建Client的场景都能覆盖,而且fixture可以复用在所有相关测试里。
内容的提问来源于stack exchange,提问作者tg295
相关产品推荐
相关产品推荐

