Измените метод экземпляра MagicMock return_value, вызываемый на PropertyMock - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь изменить вызываемый метод для экземпляра на моем 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 голосов
/ 26 сентября 2018

Перезаписывать нужное свойство с помощью 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...