【发布时间】:2015-08-07 04:45:59
【问题描述】:
我正在尝试为具有上下文管理器和许多调用的类函数的方法编写单元测试。我很难理解如何正确模拟该函数,以便我可以测试返回值。我要模拟的类是 db。正如您在下面看到的,我正在使用一个补丁,但我无法弄清楚如何让它返回正确的方法调用。我得到的是一个通用的模拟函数,而不是我期望的返回值。
db_class.py
import db
class Foo():
def __init__(self):
pass
def method(self):
with db.a() as a:
b = a.b
return b.fetch()
unit_db.py
from mock import Mock, patch, MagicMock
from db_class import Foo
@patch('db_class.db')
def test(db_mock):
expected_result = [5,10]
db_mock.return_value = Mock(__enter__ = db_mock,
__exit___ = Mock(),
b = Mock(fetch=expected_result))
foo = Foo()
result = foo.method()
assert result == expected_result
【问题讨论】:
-
你到底想模拟什么?
-
您能检查一下您的代码吗? Foo 不是 db 的一部分,而是 db_class 根据你写的。您似乎还试图模拟整个 db 模块,但在您的 with 语句中,您需要模拟 db.a() 方法。最后,您误解了如何在模拟中指定方法。这里 enter 和 exit 是属性,但应该是方法。与 b 规范中的 fetch 相同。
-
@Cilyan - 感谢您的回复 - 我更新了代码以正确导入 Foo 方法您的回复很有意义,我猜首先我应该添加另一个补丁 @patch('db_class .db.a') 被嘲笑。我仍然对如何实现 fetch、enter 和 exit 作为方法与属性感到困惑。
-
@vks 我正在尝试模拟 db_class foo.method。我想检查它返回的结果是否是预期的结果。
-
@Cilyan 好的,我想我已经找到了解决方案,感谢您的见解!
标签: python unit-testing mocking patch with-statement