![](/img/trans.png)
[英]Pytest PropertyMock as return_value for MagicMock does not get invoked
[英]Change MagicMock return_value instance method callable to PropertyMock
我试图将我的MagicMock
上的实例方法的可调用方法MagicMock
为PropertyMock
因为这是如何访问它的方法(Django模型列)。 但是测试失败了
_mock_self = <PropertyMock name='get().my_prop' id='4524632776'>
给出以下代码
# view
def get(self request):
# stuff...
obj = MyModel.objects.get(id=2)
# more stuff...
print(obj.my_prop)
some_val = MyOtherModel(my_prop=obj.my_prop)
# tests
def test_my_test(mocker):
other_obj = mocker.patch("app.views.MyOtherModel")
obj_get = mocker.patch("app.views.MyModel.objects.get")
obj_prop = mocker.PropertyMock(return_value=1)
# This should translate to an instance of MyModel i.e. MyModel().my_prop
obj_get.return_value.my_prop = obj_prop
# run view
obj_prop.assert_called_once() # Says never invoked
# Failed as my_prop was a PropertyMock instead of actual value
other_obj.assert_called_once_with(my_prop=obj_prop)
打印声明显示
<PropertyMock name='get().my_prop' id='4524632776'>
因此看来,它是与实际上未被调用的相同实例
我还尝试过直接从模型中修补该属性,但是由于Mocks
不相同,因此似乎不起作用。
def test_my_test(mocker):
other_obj = mocker.patch("app.views.MyOtherModel")
obj_prop = mocker.patch("app.views.MyModel.my_prop", new_callable=mocker.PropertyMock)
obj_get = mocker.patch("app.views.MyModel.objects.get")
obj_get.return_value.my_prop = obj_prop
# run view
obj_prop.assert_called_once()
# Failed as my_prop was a PropertyMock instead of actual value
other_obj.assert_called_once_with(my_prop=obj_prop)
失败了...
_mock_self = <PropertyMock name='my_prop' id='4543022192'>
但是打印
<MagicMock name='get().my_prop' id='4543752232'>
编辑在其他补丁中添加,可以更准确地描述实现
不需要使用PropertyMock
覆盖所需的属性,因为我只需将所需的值分配给MagicMock
。
def test_my_test(mocker):
other_obj = mocker.patch("app.views.MyOtherModel")
obj_get = mocker.patch("app.views.MyModel.objects.get")
obj_get.return_value.my_prop = 2
# run view
other_obj.assert_called_once_with(my_prop=obj_get.return_value.my_prop)
.assert_called_once
用于检查是否曾经调用过该属性,并在最初失败的.assert_called_once_with
失败时添加了该属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.