- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 pytest 中使用 Monkeypatch 固定装置,试图模拟终端窗口的当前大小。
import os
import pytest
def get_terminal_size():
terminal_size = os.popen('stty size', 'r').read()
return terminal_size
def test_get_terminal_size(monkeypatch):
# The get_terminal_size() function will return a string 'height width\n'
def mock_size():
return '10 20\n'
monkeypatch.setattr(os.popen('stty size', 'r'), 'read', mock_size)
assert get_terminal_size() == '10 20\n'
当我运行 pytest 时,出现断言错误:
__________________________________________________________________ test_get_terminal_size __________________________________________________________________
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f5bf1ec0cf8>
def test_get_terminal_size(monkeypatch):
# The get_terminal_size() function will return a string 'height width\n'
def mock_size():
return '10 20\n'
monkeypatch.setattr(os.popen('stty size', 'r'), 'read', mock_size)
> assert get_terminal_size() == '10 20\n'
E AssertionError: assert '' == '10 20\n'
E + 10 20
test_monkeypatch.py:15: AssertionError
所以看起来它没有设置mock_size。我尝试遵循 pytest documentation 中的模式
关于让它发挥作用有什么建议吗?
提前致谢!
更新:正如 Kent Shikama 在下面的答案中指出的那样,对于我 try catch 输出的方式,我需要使用 -s 标志来关闭 pytest 捕获。
但随着对 popen 用法的进一步研究,特别是从使用 os.popen 迁移到 subprocess.Popen,请参阅 here ,以及来自此的一些帮助 S.O. post在“如何伪造 Popen”中,我想出了一个解决方案。
这是新设置:
# \mokeypatch_popen.py
from subprocess import Popen
def get_terminal_size():
terminal_size = Popen('stty size', shell=True)
return terminal_size
测试函数:
# \test_monkeypatch.py
import pytest
import monkeypatch_popen
def test_get_terminal_size(monkeypatch):
# The get_terminal_size() function will return a string 'height width\n'
def mock_terminal_size(cmd, **kwargs):
return '10 20\n'
monkeypatch.setattr(m_patch, 'Popen' , mock_terminal_size)
assert m_patch.get_terminal_size() == '10 20\n'
一开始对我来说并不明显的是,mock_terminal_size 函数将处理它正在模拟的 Popen 方法的参数,因此它必须接受 Popen 在原始函数中使用的参数。我本来可以专门将 shell 参数添加到mock_terminal_size,但由于 Popen 接受一长串 kwargs,所以我有点模糊。
现在,当我运行 pytest 时,这个问题就过去了,并且 -s 标志不是必需的,因为我不再 try catch 输出,而是模拟 Popen 方法的执行。
最佳答案
首先,您需要使用 -s
标志运行 pytest,否则 stty 将被捕获。然后你应该得到你可能期望的断言错误,如下所示:
> assert get_terminal_size() == '10 20\n'
E AssertionError: assert '24 80\n' == '10 20\n'
E - 24 80
E + 10 20
听起来您想模拟流上的读取方法,使其始终运行“10 20”。通常你会做类似的事情
from io import TextIOWrapper
monkeypatch.setattr(TextIOWrapper, 'read', mock_size)
但不幸的是你不能模拟内置对象。您可以尝试类似 forbiddenfruit来克服这个问题,但感觉你可能想要改变你的方法。
关于python - pytest Monkeypatch 终端大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60272369/
我正在尝试使用 pytest 测试一些代码,并且需要更改某个模块中的函数。我的一个导入也导入了该函数,但是当我使用 monkeypatch 更改方法时,此操作失败。这是我所拥有的: util.py d
我正在尝试使用 monkeypatch 来模拟一个公共(public)函数,但它似乎对我不起作用。 这是我的文件结构 myproject |-mrss |- feed_burner.py
我想知道是否有人可以解释并提供解决此问题的方法: $ cat object-override-methods.py class A: def foo(self): return
我有一些愚蠢的代码,其中包含猴子匹配部分。以下示例仅供自学,不用于生产。 class MyClass: def some_method(self): print("some_m
大家好, 我正在使用 sympy 进行研究,发现自己写了很多像 Integer(1)/k 这样的东西(实际上,这已经是 Integer(1)/Integer( k)). 我想知道是否有一种方法可以将
来自大学的建议和关注this answer 我正在尝试对 res.send 进行猴子修补,但出现以下错误: TypeError: Cannot read property 'req' of undef
在nodev4上运行 - 假设我有 2 个库:foo 和 bar foo 有这个 var bar = require('./lib/bar'); exports = module.exports =
我正在通过请求的 Session 类在 python 中访问 API。我正在使用 requests.Session() 进行 GET 和 POST 方法调用。 在每次调用(GET/POST)失败时,我
灵感来自 "Define @property on function" ,我试图覆盖函数的命名空间: >>> class MyDict(dict): ... def __getitem__(s
我正在 pytest 中使用 Monkeypatch 固定装置,试图模拟终端窗口的当前大小。 import os import pytest def get_terminal_size():
我正在尝试对我使用的外部模块中的函数进行 Monkeypatch,但 Monkeypatch 似乎无法访问该函数,因为模块的命名空间在导入时被覆盖。 具体来说,我使用 Bio.PDB.PDBList.
我正在尝试在pytest和monkeypatching的帮助下模拟我正在调用的函数的返回值。 我为我的模拟类设置了固定装置,并且我正在尝试“覆盖”所述类中的方法之一。 from foggycam im
我知道这是一个疯狂的黑客行为,但无论如何我对此感到好奇。我们的环境的系统时间错误,我们无法将其设置为正确的时间。它是专用硬件,因此我们无法更改系统时间。不过,我们确实有一项服务可以为我们提供正确的当前
我的网络应用程序的主 JavaScript 中有以下代码: // uniq for arrays if (!Array.prototype.getUnique) { Array.pro
我已经阅读了我能找到的所有其他相关答案,但没有一个有效。本质上,我想制作这个来源: https://github.com/gildas-lormeau/zip.js/blob/master/WebCo
我正在练习 TDD,而且我对此还很陌生。在我的测试用例中,我想从 stdin 读取并检查输出是否与输入匹配。 对于stdin,我想使用模拟对象。因此我使用 monkeypatch.setattr('s
我想测试一个函数的默认行为。我有以下内容: # app/foo.py DEFAULT_VALUE = 'hello' def bar(text=DEFAULT_VALUE): print(te
给定一个类 A 我可以简单地通过 a 添加一个实例方法 def a(self): pass A.a = a 但是,如果我尝试添加另一个类 B 的实例方法 b,即 A.b = B.b,尝试调用
我想用 monkeypatch 一个 Vagrant 插件。 由于我不是 Ruby 专家,但想测试一些行为,所以我需要一些帮助。 我需要重写 chef_provisioner? 方法: https:/
我是一名 Ruby 程序员。对我来说,monkeypatching 是在运行时更改外部项目中的类或模块方法。我感兴趣的是,您有什么机制可以保护您免受某些滥用该优良特性的影响。以下是我遇到的一些场景,其
我是一名优秀的程序员,十分优秀!