Я столкнулся с каким-то странным поведением в юнит-тесте Django.В частности, я использую модуль APIClient из rest_framework.test для имитации запросов GET / POST от unittest.
Проблема возникает при обновлении / создании нового объекта в Django ORM с помощью запроса POST (см. Код ниже):
def test_something(self):
data = {
"name": 'unit testing',
"data": {}
}
response = self.api_client.post(reverse('save_model'), data=data, format='json')
self.assertEqual(response.status_code, 200)
@api_view(['GET', 'POST'])
def save_model(request):
obj, created = MyModel.objects.update_or_create(
user_id=request.user,
**request.data
)
return JsonResponse({
'id': obj.id,
'name': obj.name,
'user_id': obj.user_id.id
})
Ошибка, которую я получаю при выполнении тестового примера: Ошибка привязки параметра 1 - возможно, неподдерживаемый тип
На основании других сообщений стека, связанных с этой ошибкой, я предположил бы, что у меня есть проблема с типом для второго параметра (поле данных).Однако когда одни и те же точные данные используются для хранения объекта в оболочке Django, они работают каждый раз.Кроме того, когда запрос сделан клиентом (с теми же данными), запрос выполняется каждый раз.
Если я распечатываю данные в запросе unittest, я получаю следующее: (, u '{}')(тестирование юнитов)
Код модели указан ниже:
class MyModel(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=255)
user_id = models.ForeignKey(AUTH_USER_MODEL)
data = JSONField()
Так что я подумал, что это может быть проблема с Unicode.Но опять же, сохранение объекта с данными Юникода в оболочке работает просто отлично.Заметим одно тонкое отличие: django unittest создаст новую тестовую базу данных для моделей, тогда как работа в оболочке этого не делает.
У меня нет ответов, поэтому, если кто-то сможет пролить свет на то, что здесь происходит,это было бы удивительно.