我在这里看到了两个问题。一个是直接修复问题,另一个是对Mocking框架的轻微误用,它进一步简化了您的实现。在
首先,为了直接解决您的问题,根据您如何测试您的断言,您实际上希望在这里做什么:requests.get = get
您应该在这里使用side_effect来帮助引发异常。根据documentation:side_effect allows you to perform side effects, including raising an
exception when a mock is called
记住这一点,你真正需要做的就是:
^{pr2}$
这应该会引起你的异常。然而,你很可能会面临这样的错误:TypeError: catching classes that do not inherit from BaseException is not allowed
这可以通过阅读{a2}关于为什么会发生这样的好答案来解释。有了这个答案,接受这个建议实际上只是模仿你需要的东西,这将有助于完全解决你的问题。因此,最终,您的代码实际上看起来像这样,使用mocked get而不是mockedrequests模块:class MyUnitTest(unittest.TestCase):
@patch('my_module.requests.get')
def test_my_test(self, m_get):
def get(*args, **kwargs):
raise Timeout()
m_get.side_effect = get
try:
my_method()
except MyException:
return
现在可以通过更好地使用unittest中的assertRaises而不是try/except来进一步简化这一过程。这将最终断言在调用方法时引发了异常。此外,您不需要来创建一个将引发超时的新方法,实际上可以简单地声明mocked get将有一个引发异常的side_effect。因此,您可以简单地将整个def get替换为:m_get.side_effect = Timeout()
但是,实际上您可以直接将其放入补丁装饰器中,因此,现在您的最终代码如下所示:class MyUnitTest(unittest.TestCase):
@patch('my_module.requests.get', side_effect=Timeout())
def test_my_test(self, m_get):
with self.assertRaises(MyException):
my_method()
我希望这有帮助!在