首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ValueError:运行单元测试Django ModelViewSet时没有足够的值可解压缩

ValueError:运行单元测试Django ModelViewSet时没有足够的值可解压缩
EN

Stack Overflow用户
提问于 2020-12-19 06:37:08
回答 2查看 285关注 0票数 1

我测试了一个使用ModelViewSet检索数据的端点,并通过URL将一个参数传递给它以获取数据,但在运行单元测试时收到以下错误:

代码语言:javascript
复制
   File "/Users/lutaayaidris/Documents/workspace/project_sample/project_sample/financing_settings/tests.py", line 195, in test_get_blocks
    self.block_get_data), content_type='application/json')
  File "/Users/lutaayaidris/Documents/workspace/project_sample/lib/python3.6/site-packages/rest_framework/test.py", line 286, in get
    response = super().get(path, data=data, **extra)
  File "/Users/lutaayaidris/Documents/workspace/project_sample/lib/python3.6/site-packages/rest_framework/test.py", line 194, in get
    'QUERY_STRING': urlencode(data or {}, doseq=True),
  File "/Users/lutaayaidris/Documents/workspace/project_sample/lib/python3.6/site-packages/django/utils/http.py", line 93, in urlencode
    for key, value in query:
ValueError: not enough values to unpack (expected 2, got 1)

这就是我如何组织我的测试,以及一些用于测试的虚拟数据:

代码语言:javascript
复制
class TemplateData:

    """Template Mock data."""

    
    step_get_data = {
        "param": "step"
    }

    block_get_data = {
        "param": "block"
    }

    get_no_data = {
        "param_": "block"
    }


class TemplateViewTests(TestCase, TemplateData):

    """Template Tests (Block & Step)."""

    def setUp(self):
        """
        Initialize client,  Step and Block id and data created.
        """
        self.client = APIClient()
        self.block_id = 0
        self.step_id = 0
        self.create_block_step_data()

    def create_block_step_data(self):
        """Create ProcessVersion, Step, & Block mock data."""
        self.process_version = ProcessVersion.objects.create(
            tag="TESTING_TAG",
            is_process_template=False,
            status="IN EDITING",
            attr_map="TESTING_ATTR",
            loan_options=None
        )

        self.step = Step.objects.create(
            version=self.process_version,
            is_process_template=True,
            title="TESTING",
            help_text="TESTING",
            order=1,
            slug="slug",
            can_be_duplicated=False,
            max_duplicated_number=2,
        )

        self.step_id = self.step.pk

        self.block_id = Block.objects.create(
            step=self.step,
            is_process_template=True,
            title="TESTING",
            information_text="This is  testing "
                             "information",
            order=1,
            depending_field="depending_field",
            visibility_value="visibility_value",
            slug="slug",
            can_be_duplicated=False,
            max_duplicated_number=2,
            ).pk

        self.process_version_1 = ProcessVersion.objects.create(
            tag="TESTING_TAG",
            is_process_template=False,
            status="IN EDITING",
            attr_map="TESTING_ATTR",
            loan_options=None
        )

        self.step_1 = Step.objects.create(
            version=self.process_version_1,
            is_process_template=True,
            title="TESTING",
            help_text="TESTING",
            order=1,
            slug="slug",
            can_be_duplicated=False,
            max_duplicated_number=2,
        )

        self.block_1 = Block.objects.create(
            step=self.step,
            is_process_template=True,
            title="TESTING",
            information_text="This is  testing "
                             "information",
            order=1,
            depending_field="depending_field",
            visibility_value="visibility_value",
            slug="slug",
            can_be_duplicated=False,
            max_duplicated_number=2,
        ).pk

    def test_get_blocks(self):
        """Test get list of Block. """
        response = self.client.get(
            "/api/v1/financing-settings/template/",
            data=json.dumps(
                self.block_get_data), content_type='application/json')
        self.assertEqual(response.status_code, 200)

    def test_get_steps(self):
        """Test get list of Step. """
        response = self.client.get(
            "/api/v1/financing-settings/template/",
            data=json.dumps(
            self.block_get_data),
            content_type='application/json')
        self.assertEqual(response.status_code, 200)

    def test_no_step_or_block(self):
        """Test get no list of Step or Block. """
        response = self.client.get(
            "/api/v1/financing-settings/template/",
           data=json.dumps(
            self.block_get_data),
            content_type='application/json')
        self.assertEqual(response.status_code, 204)

正如你在上面看到的,这些是我的测试,我已经设置了数据,现在我想检索回数据,但由于上面的异常,我不能。

最后,在我的端点实现中,我使用了一个视图集来处理这个问题,下面是代码:

代码语言:javascript
复制
class TemplateView(ModelViewSet):
    """ViewSet for Saving Block/ Step template."""

    
    def list(self, request, *args, **kwargs):

        """Get list of Block/Steps with is_process_template is equal to True."""
        param = request.data['param']

        if param == "block":
            _block = Block.objects.filter(is_process_template=True).values()
            return JsonResponse({"data": list(_block)}, safe=False, status=200)

        elif param == "step":
            _step = Step.objects.filter(is_process_template=True)
            return JsonResponse({"data": list(_step)}, safe=False, status=200)

        return Response(status=status.HTTP_204_NO_CONTENT)

是什么导致了这一点,在我的理解中,我觉得一切都应该正常工作。

EN

回答 2

Stack Overflow用户

发布于 2021-02-05 07:11:07

函数Client.get期望一个字典作为数据参数,并尝试使用函数urlencode将其编码到url中。你可以这样做:

代码语言:javascript
复制
from django.test import Client
c = Client()
block_get_data = {
    "param": "block"
}
c.get('path', block_get_data)

将在url中以'param=block‘的形式发送block_get_data

如果您想在GET方法中发送JSON格式的数据,您可以使用Client.generic函数,如下所示:

代码语言:javascript
复制
from django.test import Client
import json

c = Client()
block_get_data = {
    "param": "block"
}
c.generic('GET', 'path', json.dumps(block_get_data), 'application/json')
票数 1
EN

Stack Overflow用户

发布于 2020-12-19 06:58:03

您将面临此错误,因为此字典

代码语言:javascript
复制
block_get_data = {
        "param": "block"
    }

你正试着这样使用它

代码语言:javascript
复制
for key,val in block_get_data

它会产生这样的错误

代码语言:javascript
复制
for key,val in block_get_data:
ValueError: too many values to unpack (expected 2)

如果你使用.items()方法通过dict循环,就可以解决这个问题。

代码语言:javascript
复制
for key,val in block_get_data.items():

我认为通过将参数作为self.block_get_data.items()传递可以解决您的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65364808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档