将可调用的MagicMock return_value实例方法更改为PropertyMock

时间:2018-09-26 14:54:26

标签: python django mocking

我正在尝试将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'>

EDIT (添加其他补丁),可以更准确地描述实施情况

1 个答案:

答案 0 :(得分:0)

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最初失败时添加的。