Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TestCase-模拟时with语句中未引发异常___Python_Django_Unit Testing_Mocking_With Statement - Fatal编程技术网

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

As
self.\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()