我有一个函数(foo)调用另一个函数(bar).如果调用bar()引发一个HttpError,我想特别处理它,如果状态代码是404,否则重新加注.
我试图围绕这个foo函数编写一些单元测试,嘲笑调用bar().不幸的是,我无法通过模拟调用bar()来引发由我的except块捕获的异常.
这是我的代码,说明了我的问题:
import unittest
import mock
from apiclient.errors import HttpError
class FooTests(unittest.TestCase):
@mock.patch('my_tests.bar')
def test_foo_shouldReturnResultOfBar_whenBarSucceeds(self, barMock):
barMock.return_value = True
result = foo()
self.assertTrue(result) # passes
@mock.patch('my_tests.bar')
def test_foo_shouldReturnNone_whenBarRaiseHttpError404(self, barMock):
barMock.side_effect = HttpError(mock.Mock(return_value={'status': 404}), 'not found')
result = foo()
self.assertIsNone(result) # fails, test raises HttpError
@mock.patch('my_tests.bar')
def test_foo_shouldRaiseHttpError_whenBarRaiseHttpErrorNot404(self, barMock):
barMock.side_effect = HttpError(mock.Mock(return_value={'status': 500}), 'error')
with self.assertRaises(HttpError): # passes
foo()
def foo():
try:
result = …Run Code Online (Sandbox Code Playgroud) 我正在尝试测试一个类并模拟其方法之一,但我似乎无法用我的模拟行为替换其中一个实例方法的行为。我的代码是这样组织的:
--src
----module
------__init__.py
------my_class.py
--tst
----__init__.py
----test_my_class.py
my_class.py包含以下内容
class MyClass:
def __init__(self):
pass
def do_something(self):
return 'Real Output'
Run Code Online (Sandbox Code Playgroud)
我的测试文件test_my_class.py包含以下内容。
from unittest.mock import patch
from src.module.my_class import MyClass
def test_my_class():
my_class = MyClass()
assert my_class.do_something() == 'Real Output'
@patch('src.module.my_class.MyClass')
def test_mock_my_class(mock_my_class):
mock_my_class.return_value.do_something.return_value = 'Mocked Output'
my_class = MyClass()
assert my_class.do_something() == 'Mocked Output'
Run Code Online (Sandbox Code Playgroud)
第一个测试工作得很好(到目前为止没有涉及任何模拟)。然而,第二个测试给了我以下断言错误。我希望该do_something()方法被模拟并返回“模拟输出”,并且断言语句的计算结果为 true。我这里哪里出错了?
AssertionError: assert <bound method MyClass.do_something of <src.module.my_class.MyClass object at 0x1057133c8>> == 'Mocked Output'
E + where <bound method MyClass.do_something of …