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

我正在尝试将我的实例方法的可调用更改MagicMock为 a,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'>

编辑添加了更准确地描述实现的其他补丁


慕尼黑8549860
浏览 205回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python