繁体   English   中英

如何模拟我想导入的模块中的一些函数?

[英]How to mock out some functions inside a module which I want to be imported?

注意:这种情况是由于错误而发生的。 检查我的答案。

我有一个 python 文件 (myfile.py),我想用 Pytest 测试它的内容。 (内容动态变化)
我写了这段代码:

import importlib

def test_myfile(capsys, monkeypatch):
    monkeypatch.setattr('builtins.input', lambda s: "some_input")

    # Create a module from the custom Problem file and import it
    my_module = importlib.import_module("myfile")

    # Rest of the test script

当我运行测试时,我收到此错误:

OSError: reading from stdin while output is captured

产生错误是因为 myfile.py 中有一个input()指令,这意味着模拟该函数是徒劳的。

我的问题:
如何在要导入的模块中模拟一些函数?

最后我发现我在寻找解决方案的地方是错误的。
实际上,我使用 pytest 来检查学习者的反应并对其进行评分。 在我问这个问题的那一刻,我就是这样做的。

py.test test_runner.py test_case.py -v

这将测试保存在 test_case.py 中的用户响应(我在测试方法中获取第二个参数并加载其内容并例如运行所需的函数)。 然后我正在检查pytest的报告,看看是否有错误或未能确定结果。 (通过/失败)如果用户代码中存在错误(例如语法错误)或测试失败(例如没有返回必须返回的内容),通常 pytest 会失败

这次出现了一个错误,我不想停止测试。 我想在用户代码中模拟input()函数。 当我运行命令时,在运行我的测试方法之前,pytest 导入了这两个文件以收集测试方法。 由于input()函数,它无法导入 test_case.py。 它甚至没有达到我要求模拟该函数的行,并且在 init 阶段失败。

最后为了解决这个问题,我向 py.test 添加了一个参数,现在我正在运行这样的测试过程:

py.test test_runner.py --program test_case.py -v

在这种形式中 pytest 不会在test_case.py查找测试方法并且不会失败。

希望这次经历可以帮助别人

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM