为了账号安全,请及时绑定邮箱和手机立即绑定

如何模拟: pytest.raises 没有引发

如何模拟: pytest.raises 没有引发

MMMHUHU 2023-09-26 17:28:57
我正在用于subprocess一项任务,并且我有一个try/except用于捕获的块TimeoutExpired。我尝试使用来模拟我的对象,side_effect这样我就可以使用 来捕获假异常pytest.raises。无论我做什么,我都会得到DID NOT RAISE <class 'subprocess.TimeoutExpired'>。我尝试过很多事情,尽管我对嘲笑没有那么丰富的经验,但我相信类似的事情原则上应该有效:# my_check.pyfrom subprocess import TimeoutExpired, PIPE, check_outputclass Check:    def __init__(self, name):        self.name = name        self.status = self.get_status()    def get_status(self):        try:            out = check_output(["ls"], universal_newlines=True, stderr=PIPE, timeout=2)        except TimeoutExpired as e:            print(f"Command timed out: {e}")            raise        if self.name in out:            return True        return False# test_my_check.pyimport pytestfrom unittest import mockfrom subprocess import TimeoutExpired@mock.patch("src.my_check.Check", autospec=True)def test_is_installed_exception(check_fake):    check_fake.get_status.side_effect = TimeoutExpired    obj_fake = check_fake("random_file.txt")    with pytest.raises(TimeoutExpired):        obj_fake.get_status()由于某种原因它不起作用,但我无法理解出了什么问题。
查看完整描述

1 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

如果你想测试一个类()的功能,Check你不能模拟该类。您必须模拟您想要更改的调用 - 在这种情况下可能是check_output您想要引发异常的调用:


@mock.patch("src.my_check.check_output")

def test_is_installed_exception(mocked_check_output):

    mocked_check_output.side_effect = TimeoutExpired("check_output", 1)

    with pytest.raises(TimeoutExpired):

        Check("random_file.txt")

一些注意事项:

  • 你必须修补“src.my_check.check_output”,因为你导入check_output使用from subprocess import check_output,所以你使用类中的引用

  • 你必须构造一个有效的TimeoutExpired对象 - 它需要 2 个参数,所以你必须提供它们

  • 正如get_status已经调用的那样__init__,您必须测试类构造 - 由于引发的异常,您无法获得正确构造的实例


查看完整回答
反对 回复 2023-09-26
  • 1 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信