Python 3.x 模拟类属性
假设我有一些课程:Python 3.x 模拟类属性,python-3.x,python-unittest,Python 3.x,Python Unittest,假设我有一些课程: class Worker: _processor: Processor def set_processor(self, processor: Processor): self._processor = processor def start_work(self, data: bytes): self._processor.parse(data) 测试set\u处理器方法非常简单,如下所示: def test_set_processor(): m
class Worker:
_processor: Processor
def set_processor(self, processor: Processor):
self._processor = processor
def start_work(self, data: bytes):
self._processor.parse(data)
测试set\u处理器
方法非常简单,如下所示:
def test_set_processor():
mock_processor = Mock()
worker = Worker()
worker.set_processor(mock_processor)
assert worker._processor == mock_processor
我们只需将mock传递给set\u processor
方法,然后检查self.\u processor
是否等于mock
但是如何测试开始工作方法呢?我想确保使用数据调用self.\u处理器
?
如果我尝试修补处理器的\n属性,我会得到错误。以下是单元测试解决方案:
worker.py
:
从键入import Any
处理器=任何
班主任:
_处理器:处理器
def set_处理器(自身,处理器:处理器):
self.\u处理器=处理器
def启动_工作(自身,数据:字节):
self.\u处理器解析(数据)
test\u worker.py
:
导入单元测试
从工人进口工人
从unittest.mock导入mock
类TestWorker(unittest.TestCase):
def测试设置处理器(自身):
mock_处理器=mock()
工人=工人()
worker.set\u处理器(模拟处理器)
断言工作进程。\u处理器==模拟\u处理器
工人。开始工作(b“”)
mock_processor.parse.assert_调用了一次(b“”)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
unittest.main()
100%覆盖率的单元测试结果:
。
----------------------------------------------------------------------
在0.001s内运行1次测试
好啊
(venv)☁ python代码实验室[硕士]⚡ 覆盖率报告-m
姓名Stmts未找到封面
-------------------------------------------------------------------------
src/stackoverflow/59202648/test_worker.py 13 0 100%
src/stackoverflow/59202648/worker.py 8 0 100%
-------------------------------------------------------------------------
总数21 0 100%
源代码:为什么需要修补任何东西?您可以一次性测试整个过程:将mock传递给set方法,调用另一个方法并断言mock已按预期执行。是的,听起来不错。但我认为将每种方法分开测试并不是一个坏主意。现在我解决了将_processor设置为mock directly:worker._processor=mock()。然后调用方法并检查是否调用了mock。但是,作为测试的一部分,您正在干扰内部实现细节。通过公共API进行测试。