Python TestCase-模拟时with语句中未引发异常__
我正在尝试测试一个包含Python TestCase-模拟时with语句中未引发异常__,python,django,unit-testing,mocking,with-statement,Python,Django,Unit Testing,Mocking,With Statement,我正在尝试测试一个包含with语句的Python方法。with语句中的代码可能引发运行时错误。我所说的测试是在出现RuntimeError时进行的测试 \uuuuuuuuuuuuuuuuuuuuuuu和\uuuuuuuuuuuuuuuuuuuuu方法很繁重(通常是打开和关闭SSH连接),我在测试时会模拟它们 以下是我要测试的方法的简化定义: # client.py class Client(): def method_to_test(): with self:
with
语句的Python方法。with
语句中的代码可能引发运行时错误。我所说的测试是在出现RuntimeError
时进行的测试
\uuuuuuuuuuuuuuuuuuuuuuu
和\uuuuuuuuuuuuuuuuuuuuu
方法很繁重(通常是打开和关闭SSH连接),我在测试时会模拟它们
以下是我要测试的方法的简化定义:
# client.py
class Client():
def method_to_test():
with self:
raise RuntimeError()
为了澄清起见,我省略了\uuuuu enter\uuuuu
和\uuuuu exit\uuuuuu
的定义,并删除了方法中所有与当前问题无关的代码
要测试此方法,我模拟\uuuuu输入
和\uuuuu退出
,并检查是否引发运行时错误
:
# 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未引发
如果我不模拟\uuuu输入
,则会引发运行时错误
。为什么模仿\uuuu进入\uuuuu
会导致测试失败?见PEP343
Asself.\uuu exit\uuu
是Client中的MagicMock
。方法测试,self.\uu exit\uu
返回一个MagicMock
,评估为True
。运行时错误
被吞没
修复很容易self.\uu退出
以返回None
而不是MagicMock
:
# 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):
# __exit__ returns None, evaluated as False
mock_exit.return_value = None
mock_enter.return_value = None
client = Client()
with self.assertRaises(RuntimeError):
client.method_to_test()
什么是mymodule
?我认为你嘲笑的东西不对。@chepnermymodule是client.py和tests.py所在的模块。在使用pdb时,我清楚地看到self.\uuuuuu进入\uuuuu
和self.\uuuuu退出\uuuuuu
类型是MagicMock,这意味着我在正确的位置进行了修补。
# 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):
# __exit__ returns None, evaluated as False
mock_exit.return_value = None
mock_enter.return_value = None
client = Client()
with self.assertRaises(RuntimeError):
client.method_to_test()