簡體   English   中英

無法捕獲Python模擬異常

[英]Python mocked exception not being caught

努力在標題中簡潔地描述這一點...

我有一個要測試的模塊:

mod.py

import subprocess
class MyStuff(object):
    def my_fun(self):
        try:
            print subprocess
            out = subprocess.check_output(["echo", "pirates"])
        except subprocess.CalledProcessError:
            print "caught exception"

和測試模塊test_mod.py

import unittest
import mock
from mod import MyStuff
import subprocess

class Tests(unittest.TestCase):
    def setUp(self):
        self.patched_subprocess = mock.patch(
            'mod.subprocess', autospec=True)
        self.mock_subprocess = self.patched_subprocess.start()
        self.my_stuff = MyStuff()

    def tearDown(self):
        self.patched_subprocess.stop()

    def test_my_fun(self):
        self.mock_subprocess.check_output = mock.Mock(
            side_effect=subprocess.CalledProcessError(0, "hi", "no"))
        with self.assertRaises(subprocess.CalledProcessError):
            out = self.my_stuff.my_fun()

if __name__ == '__main__':
    unittest.main()

然后,我運行python test_mod.py ,我看到以下輸出:

<NonCallableMagicMock name='subprocess' spec='module' id='140654009377872'>
.
----------------------------------------------------------------------
Ran 1 test in 0.007s

OK

我很高興子流程對象已被模擬,但是為什么執行print "caught exception"語句? 我猜這是因為真正的例外,在獲得罰球test_mod.subprocess.CalledProcessException而不是subprocess.CalledProcessException因為我打算,但我不知道如何解決這個問題。 有什么建議嗎? 謝謝你的時間。

我終於解決了這個...

問題是我在CalledProcessError 整個子流程模塊,其中包括CalledProcessError異常! 這就是為什么它似乎與我在測試模塊中提出的異常不匹配的原因,因為它是一個完全不同的對象。

解決方法是模擬subprocess.check_output ,哦!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM