Don*_*kby 5 python unit-testing mocking
我已成功使用 模拟了一个属性PropertyMock,但我不知道如何检查该类的哪个实例已调用该属性。我如何断言该属性是在一个对象上调用的,而不是在另一个对象上调用的?
这是一个例子,我想断言它foo1.is_big被调用了,但foo2.is_big没有被调用:
from mock import PropertyMock, patch
class Foo(object):
def __init__(self, size):
self.size = size
@property
def is_big(self):
return self.size > 5
f = Foo(3)
g = Foo(10)
assert not f.is_big
assert g.is_big
with patch('__main__.Foo.is_big', new_callable=PropertyMock) as mock_is_big:
mock_is_big.return_value = True
foo1 = Foo(4)
foo2 = Foo(9)
should_pass = False
if should_pass:
is_big = foo1.is_big
else:
is_big = foo2.is_big
assert is_big
# How can I make this pass when should_pass is True, and fail otherwise?
mock_is_big.assert_called_once_with()
print('Done.')
Run Code Online (Sandbox Code Playgroud)
当调用其中任何一个时,当前代码将通过。
也许有更好的方法,但我通过创建一个子类来让它工作,PropertyMock该子类记录了它被调用的实例作为模拟调用的参数之一。
from mock import PropertyMock, patch
class Foo(object):
def __init__(self, size):
self.size = size
@property
def is_big(self):
return self.size > 5
class PropertyInstanceMock(PropertyMock):
"""Like PropertyMock, but records the instance that was called."""
def __get__(self, obj, obj_type):
return self(obj)
def __set__(self, obj, val):
self(obj, val)
with patch("__main__.Foo.is_big", new_callable=PropertyInstanceMock) as mock_is_big:
mock_is_big.return_value = True
foo1 = Foo(4)
foo2 = Foo(9)
should_pass = False
if should_pass:
is_big = foo1.is_big
else:
is_big = foo2.is_big
assert is_big
# Now this passes when should_pass is True, and fails otherwise.
mock_is_big.assert_called_once_with(foo1)
print("Done.")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1925 次 |
| 最近记录: |