gpt4 book ai didi

python - 为什么 Monkeypatch 无法识别构造函数中的赋值?

转载 作者:太空宇宙 更新时间:2023-11-03 20:05:15 24 4
gpt4 key购买 nike

我正在练习 TDD,而且我对此还很陌生。在我的测试用例中,我想从 stdin 读取并检查输出是否与输入匹配。

对于stdin,我想使用模拟对象。因此我使用 monkeypatch.setattr('sys.stdin', StringIO(string))stdin 替换为 StringIO,因为两者都有方法read()

# XPath.py
import sys
from io import StringIO

class XPath:
def __init__(self):
self.stdin = sys.stdin

def readStdin(self):
return self.stdin.read()
# TestXPath.py
import pytest
from XPath import XPath
from io import StringIO

def test_CanReadFromStdin(monkeypatch):
xpath = XPath()
string = "<a></a>\n"
monkeypatch.setattr('sys.stdin', StringIO(string))
assert xpath.readStdin() == string

但是,这会失败

FAILED                               [100%]
TestXPath.py:4 (test_CanReadFromStdin)
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f2dafc5ec90>

def test_CanReadFromStdin(monkeypatch):
xpath = XPath()
string = "<a></a>\n"
monkeypatch.setattr('sys.stdin', StringIO(string))
> assert xpath.readStdin() == string

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
XPath.py:9: in readStdin
return self.stdin.read()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

pytest 在没有任何标志的情况下被调用。添加 -s 会导致永无休止的循环。有趣的是,当我在省略构造函数的同时将 XPath.py 中的行更改为:

    def readStdin(self):
return sys.stdin.read()

测试成功。

为什么构造函数中的赋值不起作用?

最佳答案

我已经想出了这个解决方案。我正在使用库中的 Mock() 。然后我删除了构造函数中的 stdin 赋值。

#XPath.py
import sys
class XPath:
def __init__(self, stream):
self.stream = stream
pass

def readStdin(self):
return self.stream.read()


# test_file.py
import pytest
from XPath import XPath
from io import StringIO

def test_CanReadFromStdin(monkeypatch):
string = "<a></a>\n"
from unittest.mock import Mock
mock_stdin = Mock()
mock_stdin.readline = Mock(StringIO(string))
monkeypatch.setattr('sys.stdin', StringIO(string))
import sys
xpath = XPath(sys.stdin)
assert xpath.readStdin() == string

更新:出于演示目的,我再次将流(stdin)包含到构造函数中。这样我就可以编写第二个方法并传递文件描述符。

关于python - 为什么 Monkeypatch 无法识别构造函数中的赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59004489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com