Я пытаюсь изменить вызываемый метод для экземпляра на моем 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 Добавлены в другие патчи, которые более точно отображают реализацию