#django #django-forms #django-testing
Вопрос:
Я переопределил ModelAdmin.save_model
, чтобы запустить задачу, если было изменено определенное поле. В основном что-то вроде:
def save_model(self, request, obj, form, change): obj.save() if "field_name" in form: transaction.on_commit(lambda: trigger_task())
Теперь я пытаюсь написать модульный тест, который проверяет, будет ли эта задача инициирована в ответ на изменение поля. Только мне трудно создать форму, которая changed_data
будет содержать это поле.
Мой тест в настоящее время выглядит примерно так:
@patch(...) def test_task_should_trigger_if_field_changed(self, mocked_task): admin = MyAdmin(model=MyModel, admin_site=AdminSite()) form = MyForm({"field_name": "changed"}, initial={"field_name": "initial"}) ... admin.save_model(request=MagicMock(), obj=my_model, form=form, change=False)
Приведенный выше тест не создаст form
, который changed_data
содержит field_name
, и задача никогда не будет запущена. На данный момент я рассматриваю возможность создания издевательского объекта, который вернет это знаменитое form.changed_data["field_name"]
, но мне интересно, упускаю ли я что-то или есть более простой способ сделать это.
ПРАВКА: Я тестирую что-то еще в этом тесте, но в настоящее время это блокировщик, если я не издеваюсь над ним.