【问题标题】:Django test client post dataDjango 测试客户端发布数据
【发布时间】:2017-09-01 13:53:36
【问题描述】:

感谢 Thaian,问题已经解决,通过在“test_create”函数的开头添加登录名,因为您需要登录此站点才能使用 createview

我目前正在为 createview 编写测试,但无法向其发布数据。

被测对象有以下型号

class Role(models.Model):
    name = models.CharField(max_length=255)
    linked_tenant = models.ForeignKey(Tenant, blank=True, null=True)

And 用于以下(通用)视图

class RolCreate(TenantRootedMixin, CreateView):
    model = RolTemplate
    form_class = RoleForm

    def get_form_kwargs(self):
        kwargs = super(RolCreate, self).get_form_kwargs()
        kwargs['linked_tenant'] = self.request.tenant
        return kwargs

    def form_valid(self, form):
        form.instance.linked_tenant = self.kwargs.get('tenant')
        return super(RolCreate, self).form_valid(form)

    def get_success_url(self, **kwargs):
        return reverse('rol_list', args=[self.request.tenant.slug])

这是我正在使用的测试。

class RolCreate_tests(TestCase):

    def setUp(self):
        self.tenant = get_tenant()
        self.role = get_role(self.tenant)
        self.client = Client(HTTP_HOST='tc.tc:8000')
        self.user = get_user(self.tenant)

    def test_create(self):

        response = self.client.post(reverse('rolcreate'), {'name' : 'new_object'})
        self.assertEqual(response.status_code, 302)
        test_against = Role.objects.get(name='new_object')
        self.assertEqual(test_against, self.tenant)

引发错误的断言是最后的“get”请求。

DoesNotExist: Role matching query does not exist.

所以没有创建对象,但测试确实验证了 302 视图,这意味着正在发布帖子。我不明白为什么这个测试没有做它应该做的事情。有人可以帮我吗?

=====

根据泰国人的建议,我得到了以下值:

(Pdb) print(self.client.post)
<bound method Client.post of <django.test.client.Client object at     0x10f20da50>>

Pdb) response
<HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/accounts/login/?next=/my/role/create/">
(Pdb) print(response)
Vary: Cookie
Content-Length: 0
Content-Type: text/html; charset=utf-8
Location: /accounts/login/?next=/my/role/create/

【问题讨论】:

    标签: django post django-testing


    【解决方案1】:

    您是否打印了响应并检查了可能返回的内容?

    用 PDB 运行测试是个好主意。

    def test_create(self):
    
            response = self.client.post(reverse('rolcreate'), {'name' : 'new_object'})
            import pdb; pdb.set_trace()
            self.assertEqual(response.status_code, 302)
            test_against = Role.objects.get(name='new_object')
            self.assertEqual(test_against, self.tenant)
    

    在您的测试中添加 import pdb;pdb.set_trace() 然后检查 self.client.post()。

    所以请粘贴响应包含的内容。

    【讨论】:

    • 感谢您的留言,pdb 给出了以下变量输出: response: Vary: Cookie Content-Length: 0 Content-Type: text/html; charset=utf-8 位置:/accounts/login/?next=/my/role/create/ 客户端:>>
    • @Jasper 在 test_create 强制授权的第一行添加例如:self.client.force_login(self.user) 如果只有经过身份验证的用户可以创建新角色,这可能会解决您的问题。 django force_login
    • 这解决了我的问题!我完全忘记为用户添加登录名。 (由于我确实在所有其他功能上添加了它,这个错误更加严重,doh)非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 2012-01-24
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    相关资源
    最近更新 更多