我正在使用 pytest 并想要进行猴子补丁。按照 docs,以下内容应该有效,但不起作用。
import pytest
class SerialMock:
""" mock class """
monkeypatch.setattr('serial.Serial', SerialMock)
当我运行
pytest filename.py
时,我会得到 NameError
,如问题标题中所述。
如何正确使用 pytest 进行 Monkeypatch?我知道这是一个固定装置,并且我阅读了文档。
更新 对我来说,文档存在几个问题。我想保留一个修补过的对象以进行多次测试。在unittest中,使用了一个类和一个setUp方法,但在pytest中显然没有。为了实现我的目标,我提出了以下解决方案。下面的代码只是测试补丁的功能,但结构可以工作。
from _pytest.monkeypatch import MonkeyPatch
import pytest
import Device
class SerialMock():
def __init__(self, tty, baudrate, timeout=0):
super().__init__()
def write(self, message):
return message
def readline(self):
return "Hello World"
monkeypatch = MonkeyPatch()
monkeypatch.setattr('serial.Serial', SerialMock)
class TestDeviceObject:
device = Device('uno', tty='/mock/tty', baudrate=1000, wait=True)
def test_readline(self):
assert self.device.Connection.readline() is "Hello World"
def test_reread(self):
message = "Boot complete"
data = self.device.Connection.write(message)
assert data == message
我想完美的解决方案是让我的修补设备成为固定装置?
您必须定义一个以
monkeypatch
作为参数的测试函数:
import pytest
import serial
class SerialMock:
""" mock class """
def test_serial(monkeypatch):
monkeypatch.setattr(serial, 'Serial', SerialMock)
# do tests on serial.Serial