Объект типа Company не является JSON-сериализуемым при написании тестов. - PullRequest
0 голосов
/ 30 ноября 2018

У меня проблема с Django RestFramework при тестировании.У меня есть следующий тест:

def test_update_coupon(self):
        response = self.make_coupon_request(
            kind="put",
            version="v1",
            id=2,
            data=self.valid_coupon_data
        )
        self.assertEqual(response.status_code, status.HTTP_200_OK)

Где make_coupon_request имеет возврат:

return self.client.put(
    reverse("coupon",
        kwargs={
            "version": kwargs["version"],
            "pk": kwargs["id"]
        }
    ),
    data=json.dumps(kwargs["data"]),
    content_type='application/json'
)

и valid_coupon_data, где возникает проблема:

self.valid_coupon_data = {
    "company": Company.objects.get(id=1),
    "name": "Coupon Updated",
    "added": "2018-11-30",
    "code": "TESTCODE"
}

edit - Пример компании, которая будет в этой структуре:

            {
                "id": 1,
                "name": "test",
                "added": "2018-11-30"
            },

Таким образом, общая структура будет выглядеть так:

self.valid_coupon_data = {
        "company": {
                    "id": 1,
                    "name": "test",
                    "added": "2018-11-30"
                },
        "name": "Coupon Updated",
        "added": "2018-11-30",
        "code": "TESTCODE"
    }

Я получаю ошибку:в make_coupon_request , который json.dumps не может сериализовать valid_coupon_data :

"TypeError: Object of type Company is not JSON serializable"

У меня есть сериализатор для компании:

class CompanySerializer(serializers.ModelSerializer):
    coupons = CouponSerializer(many=True, read_only=True)

    class Meta:
        model = Company
        fields = ("name", "added", "coupons")

И для купона:

class CouponSerializer(serializers.ModelSerializer):
    class Meta:
        model = Coupon
        fields = ("company", "name", "added", "code")

В основном я знаю, что каким-то образом мне нужно использовать сериализатор, чтобы мой тест работал, поскольку json.dumps не принимает необработанный объект Company ... но я не уверен, каки я не совсем понимаю, почему.

Вот мои 2 модели для справки:

class Company(models.Model):
    name = models.CharField(max_length=255, null=False)

    class Meta:
        verbose_name_plural = "Companies"


class Coupon(models.Model):
    company = models.ForeignKey(
        Company, on_delete=models.CASCADE, related_name='coupons')
    name = models.CharField(max_length=100)
    added = models.DateField(auto_now_add=True)
    code = models.CharField(max_length=255, null=False)

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Проблема в том, что вы передаете объект python через json в своем тесте, этот раздел

self.valid_coupon_data = {
"company": Company.objects.get(id=1),   # This is the error point! you are passing python object not a json.
"name": "Coupon Updated",
"added": "2018-11-30",
"code": "TESTCODE"
}

И передача только целочисленного значения, как и другие ответы, также не будет работать.Вы должны также передать JSON объекта компании.как это:

company = Company.objects.get(id=1)

self.valid_coupon_data = {
"company": {
     "id": company.id,
     "name": company.name,
     "added": company.added
},
"name": "Coupon Updated",
"added": "2018-11-30",
"code": "TESTCODE"
}

Примечание Кстати, если вы используете django rest, то способ, которым вы возвращаете данные в ваших представлениях, неверен.используйте to_representation или serializer.data методы.не очень хорошо использовать json.dump, когда у вас есть мощная библиотека, такая как django-rest-framework.Вы также можете вернуть json как есть с Response библиотекой django-rest.например return Response(jsonData)

Если вы хотите получить более четкий ответ, укажите make_coupon_request коды методов.чтобы увидеть, что там происходит.

0 голосов
/ 04 декабря 2018

Проблема может заключается в этом утверждении,

<code>self.valid_coupon_data = {
    <b>"company": Company.objects.get(id=1), # here</b>
    "name": "Coupon Updated",
    "added": "2018-11-30",
    "code": "TESTCODE"
}
Очевидно, что вы пытаетесь отправить данные json, и, к сожалению, они содержат несериализуемые данные изCompany type.


Согласно указанному вами CouponSerializer приведенного ниже json достаточно для создания / обновления Coupon экземпляр.

{
    <b>"company": 1, # provide only integer value</b>
    "name": "Coupon Updated",
    "added": "2018-11-30",
    "code": "TESTCODE"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...