【发布时间】:2021-07-16 02:28:26
【问题描述】:
假设我有一个大类,其中包含许多引用self 的方法。例如:
from unittest import mock
import json
import Gamma
class Alpha:
def __init__(self):
self.a = json.loads('file_A')
self.b = json.loads('file_B')
self.c = None
self.d = None
self.e = Gamma()
def foo(self):
json.dumps(self.d)
def bar(self, dummy):
self.c = dummy.x
self.d = dummy.y
self.foo()
class Beta:
def __init__(self):
self.x = json.loads('file_X')
self.y = json.loads('file_Y')
假设我想使用模拟来测试上述示例中的bar 方法。这就是我正在尝试的,但我显然在这里遗漏了一些东西:
@mock.patch('Beta', autospec=True)
@mock.patch('Alpha', autospec=True)
def test_bar(mock_alpha, mock_beta):
# Set mock values so the Beta class gets instantiated properly
mock_beta.x = 8
mock_beta.y = 9
# Call the bar method from mocked Alpha class
mock_alpha.bar(mock_beta)
# Test whether bar method updated the Alpha class as desired
assert mock_alpha.c == 8
assert mock_alpha.foo.called
这些是我得到的两个断言的错误:
> raise AttributeError("Mock object has no attribute %r" % name)
E AttributeError: Mock object has no attribute 'c'
> assert mock_alpha.foo.called
E AssertionError: assert False
E + where False = <MagicMock name='Alpha.foo' spec='function' id='5324111568'>.called
E + where <MagicMock name='Alpha.foo' spec='function' id='5324111568'> = <MagicMock name='Alpha' spec='Alpha' id='5323992784'>.foo
如何测试 foo 使用 mock 所做的一切?
PS:这是一个精简的例子;在此特定示例中,在此处模拟 json 对象可能更有意义。但是,在我的实际用例中,Alpha 类非常复杂,要模拟所有端点需要做很多工作。我的问题仅限于是否有一种方法可以像我在示例中尝试(不成功)那样模拟类的实例。
【问题讨论】:
-
__init__应该带参数来设置大部分属性;那么你不需要模拟 anything;您只需创建一个适当的实例进行测试。 -
(你仍然可以包装一个
Alpha的实例来测试它的foo方法是否被调用,但是如果你能找到想要的result 会更好foo被调用,因为也许实现会在某个时候改变。)
标签: python unit-testing mocking