Django查看测试返回301或未找到

时间:2016-11-29 21:47:42

标签: django django-views django-testing

我试图测试视图的响应代码,但我要么得到301还是不存在。

urls.py

...
url(r'^myview/(?P<view_id>.*)/$', view_myview.index, name='myview'),
...

测试代码1:

import unittest
from django.test import Client

class SimpleTest(unittest.TestCase):
    def setUp(self):
        self.client = Client()
    def test_details(self):
        response = self.client.get('/myview/123')
        self.assertEqual(response.status_code, 200)

上面的代码给出了:

AssertionError: 301 != 200

测试代码2:

import unittest
from django.test import Client

class SimpleTest(unittest.TestCase):
    def setUp(self):
        self.client = Client()
    def test_details(self):
        response = self.client.get('/myview/123/')
        self.assertEqual(response.status_code, 200)

上面的代码给出了:

Mymodel matching query does not exist.

我想要做的只是简单测试我的观点,以确保他们不会抛出错误代码,但我似乎无法找到正确的方法来做到这一点我已经尝试过了来自互联网的许多很多建议。是否有不同的方式传递view_id?如果我还想输入一些查询参数怎么办?

编辑:更新以显示我已经习惯完成我想要做的事情的变通方法,尽管它可能很糟糕。我发现使用dumpdata和fixtures需要FOREVER。

from django.test import TestCase
from django.test import Client
import os
from . import urls_to_test    # just a simple list of strings

class SimpleTest(TestCase):
    """ Simply test if views return status 200 """
    def setUp(self):
        self.client = Client()
        print('Dumping production database...')
        os.system("sudo mysqldump mydb > /tmp/mydb.sql")
        print('Loading production data into test database...')
        os.system("sudo mysql test_mydb < /tmp/mydb.sql")
        os.system("sudo rm -rf /tmp/mydb.sql")
    def test_details(self):
        for u in urls_to_test.test_urls:
            print('Testing {}'.format(u))
            response = self.client.get(u)
            self.assertEqual(response.status_code, 200)
        print('{} URLs tested!'.format(len(urls_to_test.test_urls)))

2 个答案:

答案 0 :(得分:2)

第一个不起作用,因为Django正在重定向到带有最终斜杠的版本。

第二个告诉你它为什么不起作用:你没有在测试中创建一个id为123的项目 - 或者实际上是任何项目。

答案 1 :(得分:2)

在测试存在之前考虑创建对象:

import unittest
from django.test import Client

from app.models import YourModel

class SimpleTest(unittest.TestCase):
    def setUp(self):
        self.client = Client()
        self.obj = YourModel.objects.create(*your object goes here*)

    def test_details(self):
        response = self.client.get('/myview/123/') # It may be not /123/. It depends on how you generate url for model
        self.assertEqual(response.status_code, 200)