python-3.x - 如何模拟 Python 类的对象?
问题描述
可以说我是以下课程;
class CompositionClass(object):
def __init__(self):
self._redis = Redis()
self._binance_client = BinanceClient()
def do_processing(self, data):
self._redis.write(data)
self._binance_client.buy(data.amount_to_buy)
# logic to actually unittest
return process_val
我有其他对象在我的ComplexClass
. 当我对 的逻辑进行单元测试时do_processing
,我不想调用这些昂贵的 API 调用。我已经在 SO 和 Google 中彻底检查了单元测试;所有的例子都很简单,不是很有用。就我而言,我该如何unittest.mock
模拟这些对象?
解决方案
Redis
模拟and类的一种方法是在测试类BinanceClient
中使用patch
装饰器,例如:
from unittest import TestCase
from unittest.mock import patch
from package.module import CompositionClass
class TestCompositionClass(TestCase):
@patch('package.module.BinanceClient')
@patch('package.module.Redis')
def test_do_processing(self, mock_redis, mock_binance):
c = CompositionClass()
data = [...]
c.do_processing(data)
# Perform your assertions
# Check that mocks were called
mock_redis.return_value.write.assert_called_once_with(data)
mock_binance.return_value.buy.assert_called_once_with(data.amount_to_buy)
请注意,指定@patch
的路径是包含 的模块的路径,CompositionClass
以及它对 和 的Redis
导入BinanceClient
。修补发生在该模块中,而不是包含Redis
andBinanceClient
实现本身的模块。
推荐阅读
- python - 重新训练 Mobilenet_SSD KeyError: 'eval_input_fns'
- python - 如何替换缺少的列值?
- c# - 为什么 int.Parse 不适用于 Enum 值?
- java - 我需要使用 jcodec 从视频中保存一帧(我使用 Libgdx),但该帧未保存在 android 上
- python - 使用 python 和 xml 显示一个元素的所有属性
- python - 按字母顺序枚举具有属性的目录中的文件
- python - Python .count String 函数 - 计算字符串或行中出现的确切单词
- php - 如何在不再次单击我的按钮的情况下刷新表格
- docker - 将 rewrite_by_lua 模块添加到 nginx:alpine
- bash - 包含 git 命令的 Bash 脚本在与 perl 一起使用时表现不同