簡體   English   中英

將可調用的MagicMock return_value實例方法更改為PropertyMock

[英]Change MagicMock return_value instance method callable to PropertyMock

我試圖將我的MagicMock上的實例方法的可調用方法MagicMockPropertyMock因為這是如何訪問它的方法(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM