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)