Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 模拟类属性_Python 3.x_Python Unittest - Fatal编程技术网

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进行测试。