NameError:名称“monkeypatch”未定义

问题描述 投票:0回答:1

我正在使用 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

我想完美的解决方案是让我的修补设备成为固定装置?

python pytest monkeypatching
1个回答
0
投票

您必须定义一个以

monkeypatch
作为参数的测试函数:

import pytest
import serial

class SerialMock:
    """ mock class """


def test_serial(monkeypatch):
    monkeypatch.setattr(serial, 'Serial', SerialMock) 
    # do tests on serial.Serial
© www.soinside.com 2019 - 2024. All rights reserved.