Django View 测试返回 301 或未找到
Django View Testing Returning 301 or not found
我正在尝试测试视图的响应代码,但我得到的是 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 花了很长时间。
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)))
第一个不起作用,因为 Django 正在重定向到带有最后一个斜杠的版本。
第二个告诉您它不起作用的确切原因:您还没有在测试中创建 ID 为 123 的项目 - 或者根本没有创建任何项目。
考虑在测试其存在之前创建对象:
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)
我正在尝试测试视图的响应代码,但我得到的是 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 花了很长时间。
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)))
第一个不起作用,因为 Django 正在重定向到带有最后一个斜杠的版本。
第二个告诉您它不起作用的确切原因:您还没有在测试中创建 ID 为 123 的项目 - 或者根本没有创建任何项目。
考虑在测试其存在之前创建对象:
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)