【问题标题】:Django Integration tests for urlsurls 的 Django 集成测试
【发布时间】:2016-09-23 03:40:23
【问题描述】:

我有一个想要为其编写测试的 django 应用程序。现在我正在为 url 编写集成测试。

对于我的 signin 测试,我的网址如下所示: url(r'^signin/$', login_forbidden(signin), name='signin')

我的测试看起来像:

from django.test import TestCase


class SigninTest(TestCase):
    def test_signin(self):
        resp = self.client.get('/signin/')
        self.assertEqual(resp.status_code, 200)

但是我不知道要测试更长的网址,例如我在网址中有一个条目,例如:

url(
        r'^ad_accounts/(?P<ad_account_id>[^/]+)/$',
        AdAccountDetailView.as_view(),
        name='campaigns'
    ),

如果我对登录页面重复上述测试(替换 resp = self.client.get('/ad_accounts/'))返回失败

======================================================================
FAIL: test_signin (engineoftravel.tests.SigninTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "path/to/project/tests.py", line 7, in test_signin
    self.assertEqual(resp.status_code, 200)
AssertionError: 302 != 200

----------------------------------------------------------------------
Ran 1 test in 0.103s

FAILED (failures=1)

【问题讨论】:

    标签: python django integration-testing


    【解决方案1】:

    为什么不使用反向:https://docs.djangoproject.com/en/1.10/ref/urlresolvers/#reverse

    from django.core.urlresolvers import reverse
    
    ....
    resp = self.client.get(reverse('campaigns', args=[1]))
    

    其中 args 是您需要传入的 id。

    编辑:因为 django 1.10 从 django.urls 反向导入

    【讨论】:

    • 给了这个ImportError: No module named urls
    • from django.core.urlresolvers import reverse 如果你有早期版本的 django
    【解决方案2】:
    from django.test import TestCase
    from django.test import Client
    from django.core.urlresolvers import reverse 
    client = Client()
    class MainTest(TestCase):
        ##user login in django
        def user_login(self, username, password):
            response = self.client.login(username=username, password=username)
            return self.assertEqual(resp.status_code, 200)
       ## first case
       def detail(self):
         response = self.client.get('/ad_accounts/<test_num>/') ## url regex
         self.assertEquals(response.status_code, 200)
    
       def detail2(self):
           response = self.client.get(reverse('campaigns'))
           self.assertEqual(response.status_code, 200)
    

    【讨论】:

      【解决方案3】:

      如果测试失败,请先login与某个测试用户发出请求,否则页面将被重定向到登录页面,因此您将获得302状态码。

      您还可以使用client.get('/foo', follow=True) 测试重定向页面的状态代码,它返回登录页面的状态代码。 (在你的例子中)

      【讨论】:

        猜你喜欢
        • 2013-08-06
        • 2014-11-12
        • 1970-01-01
        • 1970-01-01
        • 2013-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多