- 57
- 0
大家好!
这可能是一个关于unittest.mock.patch()和unittest.mock.patch.object()的区别的问题,下面的代码使用mock.patch.object()时,可以正常运行,我不明白为什么使用mock.patch()的时候,会报错ModuleNotFoundError: No module named 'Person',这种情况是一定不能用mock.patch()吗?
# py_unittest.py
from unittest import TestCase
from unittest.mock import patch
from unittest import main
class Person(object):
def __init__(self, name):
self.name = name
def print_name(self):
print('My name is ' + self.name)
def print_parents(self):
mother = input("Enter mother's name: ")
father = input("Enter father's name: ")
print("{}'s parents are {} and {}.".format(self.name, mother, father))
self.fake_func()
def fake_func(self):
pass
class FuncTest(TestCase):
def test_print_parents(self):
john = Person('John')
with patch('builtins.input') as mocked_input:
mocked_input.side_effect = ('Jo', 'Lee')
with patch('builtins.print') as mocked_print:
with patch.object(Person, "fake_func") as mocked_fake_func:
# with patch('Person.fake_func') as mocked_fake_func: 如果启用这段代码会报错 ModuleNotFoundError: No module named 'Person'
john.print_parents()
mocked_print.assert_called_with("John's parents are Jo and Lee.")
mocked_fake_func.assert_called_once()
if __name__ == '__main__':
main()
- 共 0 条
- 全部回答
-
〣.不做∫仙女∫好多年 普通会员 1楼
mock.patch和mock.patch.object都用于在测试中模拟真实对象的行为,但它们之间有一些区别。mock.patch是用来替换现有函数或方法的行为,而mock.patch.object是用来替换现有类的行为。这意味着,如果你有一个函数或方法,你可以在mock.patch.object中对其进行修改,而不会影响到现有的代码。例如,假设我们有一个名为
user的类,它有一个名为get_name的方法。我们想要在测试中替换user.get_name的行为,但不改变这个方法的输入。我们可以这样做:```python from mock import patch
class TestUser:
def test_get_name(self): user = User() # 创建一个真实的 get_name 方法,然后将其替换为我们的模拟方法 with patch.object(user, 'get_name', return_value='John Doe'): user.get_name() # 现在,当我们调用 `user.get_name()` 时,它将返回 'John Doe' 而不是真实的 get_name 方法 assert user.get_name() == 'John Doe'```
在上面的例子中,我们首先创建了一个
User类和一个get_name方法。然后,我们使用patch.object(user, 'get_name', return_value='John Doe')来模拟get_name方法的行为。最后,我们调用user.get_name(),它将返回 'John Doe' 而不是真实的get_name方法。而
mock.patch.object是用来替换现有类的行为。这意味着,如果你想在一个类中替换一个方法的行为,你可以在mock.patch.object中对其进行修改,而不会影响到现有的代码。例如,假设我们有一个名为
Person的类,它有一个名为get_name的方法。我们想要在测试中替换Person.get_name的行为,但不改变这个方法的输入。我们可以这样做:```python from mock import patch
class TestPerson:
def test_get_name(self): person = Person() # 创建一个真实的 get_name 方法,然后将其替换为我们的模拟方法 with patch.object(person, 'get_name', return_value='John Doe'): person.get_name() # 现在,当我们调用 `person.get_name()` 时,它将返回 'John Doe' 而不是真实的 get_name 方法 assert person.get_name() == 'John Doe'```
在上面的例子中,我们首先创建了一个
Person类和一个get_name方法。然后,我们使用patch.object(person, 'get_name', return_value='John Doe')来模拟get_name方法的行为。最后,我们调用person.get_name(),它将返回 'John Doe' 而不是真实的get_name方法。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
