1 回答

TA贡献1827条经验 获得超8个赞
您不需要为您正在做的事情打补丁(示例 A)。您正在传递参数 c,您知道它是 BasicClass 的类,因此不需要补丁。如果您在您不希望实际发生的测试函数中引入了函数调用或对象初始化,您将需要一个补丁。
使用时@patch我们应该使用 kwargside_effect来模拟异常的引发,而不是调用其他函数。如果我们想模拟函数的返回值,请使用 kwarg return_value。如果我们只是想模拟一个函数,那么我们只需使用@patch没有任何 kwargs。当我们使用补丁作为装饰器时,我们需要将它们传递给函数。确实可以不用它们,但我们应该将它们与模拟函数一起使用,例如assert_called_once或assert_called_once_with以确保您的补丁按预期工作。请参见示例 B
==============示例A==================
import unittest
def my_basic_function(value, c):
return c(value).words()
class BasicClass:
def __init__(self, val):
self.val = val
def words(self):
return self.val
class TestMyBasicFunction(unittest.TestCase):
def test_my_basic_class(self):
value = my_basic_function("jeremy", BasicClass)
self.assertEqual("jeremy", value)
def test_my_basic_class_wrong(self):
value = my_basic_function("jeremy", BasicClass)
self.assertNotEqual("w33b", value)
============示例B======================
import unittest
from unittest.mock import patch
def ensure_str(value):
try:
return str(value)
except Exception:
raise TypeError
def my_basic_function(value, c):
value = ensure_str(value)
return c(value).words()
class BasicClass:
def __init__(self, val):
self.val = val
def words(self):
return self.val
class TestMyBasicFunction(unittest.TestCase):
@patch('script.ensure_str', return_value="jeremy")
def test_return_value(self, ensure_str_mock):
value = my_basic_function("jeremy", BasicClass)
ensure_str_mock.assert_called_once_with("jeremy")
self.assertEqual("jeremy", value)
@patch('script.ensure_str')
def test_no_return_value(self, ensure_str_mock):
value = my_basic_function("jeremy", BasicClass)
self.assertEqual(ensure_str_mock(), value)
@patch('script.ensure_str', side_effect=TypeError)
def test_side_effect(self, ensure_str_mock):
with self.assertRaises(TypeError):
value = my_basic_function({'apple': 'sauce'}, BasicClass)
ensure_str_mock.assert_called_once_with({'apple': 'sauce'})
添加回答
举报