0

Я очень новичок в тестировании модулей и, вероятно, что-то не так, но когда я имитирую пост для обновления модели через бэкэнд администратора, похоже, мой метод save_model в моей AdminForm не является называется. Я пытаюсь проверить этот метод - что я делаю неправильно?Django - Unit Testing AdminForm

Мой второй, менее актуальный вопрос в целом, как я могу убедиться, что метод вызывается, когда я использую модульное тестирование? Есть ли способ перечислить все методы, которые были удалены?

Ниже приведено мое тестовое задание. В моем методе save_model в моей AdminForm для этой модели я установил атрибут foobar этой модели для имени пользователя текущего пользователя. Ниже мой тест:

self.client = Client() 
self.client.login(username='username',password='password') 
# self.dict is a dictionary of field names and values for mymodel to be updated 
response = self.client.post('/admin/myapp/mymodel/%d/' % self.mymodel.id, self.dict) 
self.assertEqual(response.status_code,200) # passes 
self.assertEqual(self.mymodel.foobar,'username') # fails 
self.client.logout() 

Это терпит неудачу, потому что он говорит, что self.mymodel.foobar пустая строка. Это было то, что должно было быть до обновления. В self.dict не передается значение foobar, но мой метод save_model предназначен для установки его самостоятельно, когда происходит обновление. Также стоит отметить, что мой код работает правильно, и save_model, похоже, работает нормально, просто мой тест не работает. Поскольку я являюсь полным noob в TDD, я уверен, что проблема связана с моим тестом, а не с моим кодом. Мысли?

ответ

0

Из кода похоже, что проблема заключается в том, что после публикации формы вы не перезагружаете self.mymodel из базы данных. Если вы держите ссылку на объект модели, хранящийся в базе данных, и одно или несколько полей на этом объекте будут изменены в базе данных, вам потребуется перезагрузить объект из базы данных, чтобы просмотреть обновленные значения. Как подробно описано в this question, вы можете сделать это с чем-то вроде:

self.mymodel = MyModelClass.objects.get(id=self.mymodel.id) 

Чтобы ответить на ваш второй вопрос, вероятно, самый полезный способ, чтобы увидеть, что происходит будет использовать протоколирование для вывода, что происходит в вашем методе save_model - это не только поможет вам отладить проблему во время тестирования, но и если вы столкнетесь с какими-либо проблемами в этом методе при запуске приложения. Джанго руководство к полеганию дает превосходное введение:

https://docs.djangoproject.com/en/dev/topics/logging/

+0

имеет смысл. Я в конечном итоге пошел на другой подход, поэтому вопрос немного спорный, но спасибо за вход в любом случае. – Kvass