如何从Django(rest_framework)中的APIClient正确发送数据以进行POST请求

时间:2019-02-07 18:05:18

标签: django unit-testing django-rest-framework

我在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中运行则不会。

我没有答案,所以如果有人可以阐明这里发生的事情,那将是惊人的。

0 个答案:

没有答案