#django #unit-testing #django-models
Вопрос:
/*tests.py*/
def create_user(username, password):
user = get_user_model().objects.create_user(username=username, password=password)
return user
#helper function to populat database
def create_category(name, super, user):
category = Category.objects.get_or_create(name=name)[0]
category.super = super
category.user = user
category.save()
return category
# The following test is for the save and deleting of
# a page from the favorites list
class TestFavoritesFeature(TestCase):
def setUp(self):
self.user = create_user("testUser", "testPassword")
self.cat = create_category('python', self.super, self.user)
Как object.create, так и object.get_or_create выдают ошибку для поля NOT NULL. Выше приведен код , 2 модели, и обе выдают ошибку только в поле идентификатора, которое мы даже не заполняем. Задача функции состоит в том, чтобы присвоить ей уникальный идентификатор. Выше приведен код из tests.py файл. Я пытаюсь заполнить базу данных для модульного тестирования . В реальном коде эти объекты.get_or_create или objects.create не выдают ошибок, но довольно успешны
Комментарии:
1. разве вы не должны использовать
self.client.get(...,{'page_id': self.page.id})
это сpage_id
overid
?
Ответ №1:
В .get_or_create(…)
[Django-doc] вам нужно указать значения для super_cat
, user
и name
, но вы сделали это только для имени.
Мы можем еще больше упростить метод, используя .update_or_create(…)
[Django-doc] и используя defaults=…
параметр, чтобы указать, что следует обновлять или инициализировать в случае, если объект не создан/не создан:
def create_category(name, super, user):
category, __ = Category.objects.update_or_create(
name=name,
defaults={'super_cat': super, 'user': user}
)
return category
Комментарии:
1. Да, спасибо, это работает. Теперь у меня есть ManyToManyField, он не позволяет мне передавать значения по умолчанию в качестве пары значений ключа. как мне продолжать добавлять его ?
2. @NikhitaSareen: вам нужно будет обновить это в строках после
category, __ = ...
иreturn category
. Там вы можете использоватьcategory.yourm2mfield.add(some_item)
и т. Д.3. Когда я пытаюсь ответить = self.client.get(url) во время модульного тестирования. Я получаю сообщение о том, что анонимный пользователь не приемлет ошибку типа: аргумент int() должен быть строкой, байтовым объектом или числом, а не «Анонимным пользователем»
4. @NikhitaSareen: сначала вам нужно будет войти в систему, а также может быть полезно добавить функцию защиты, чтобы вы не создавали
Category
, если пользователь не указан.5. Да, вошел в систему . Теперь у меня проблема с self.client.get, я делаю self.response = self.client.get(обратный(‘rango:save_favorite’) Но, похоже, он не выполняет представление, связанное с сохранением избранного, потому что в представлении я сохраняю элемент в БД. Когда я пытаюсь утверждать, что элемент был добавлен, это не удается