【发布时间】:2017-04-12 12:22:40
【问题描述】:
我正在尝试测试一个包含 with 语句的 Python 方法。 with 语句中的代码可以引发RuntimeError。我所说的测试测试RuntimeError 是否被引发。
__enter__ 和 __exit__ 方法很重(通常打开和关闭 SSH 连接),我在测试时模拟它们。
这是我要测试的方法的简化定义:
# client.py
class Client():
def method_to_test():
with self:
raise RuntimeError()
为了清楚起见,我省略了__enter__和__exit__的定义,并删除了method_to_test中所有与当前问题无关的代码。
为了测试这个方法,我模拟了__enter__ 和__exit__,并检查RuntimeError 是否被提升:
# tests.py
from django.test import TestCase
import mock
from .client import Client
class ClientTestCase(TestCase):
@mock.patch('mymodule.client.Client.__enter__')
@mock.patch('mymodule.client.Client.__exit__')
def test_method_raises_Runtime(self, mock_exit, mock_enter):
mock_enter.return_value = None
client = Client()
with self.assertRaises(RuntimeError):
client.method_to_test()
此测试失败:AssertionError: RuntimeError not raised
如果我不模拟 __enter__,则会引发 RuntimeError。为什么嘲笑 __enter__ 会使这个测试失败?
【问题讨论】:
-
什么是
mymodule?我不认为你嘲笑了正确的事情。 -
@chepner mymodule 是 client.py 和 tests.py 所在的模块。在使用pdb时,我清楚地看到
self.__enter__和self.__exit__类型是MagicMock,这意味着我在正确的地方打补丁。
标签: python django unit-testing mocking with-statement