我在Django单元测试中遇到了一些奇怪的行为。具体来说,我使用来自rest_framework.test的APIClient模块来模拟来自单元测试的GET / POST请求。
通过POST请求在Django ORM中更新/创建新对象时,会发生此问题(请参见下面的代码):
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 Shell中时,它每次都会工作。此外,当从客户端(具有相同数据)发出请求时,请求每次都会成功。
如果我在unittest请求中打印数据,则会得到以下信息: (,u'{}') (,u'unit testing')
型号代码如下:
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问题。但是再一次,将具有unicode数据的对象存储在外壳中就可以了。需要注意的一个细微差别是,django unittest将为模型创建一个新的测试数据库,而在shell中运行则不会。
我没有答案,所以如果有人可以阐明这里发生的事情,那将是惊人的。