【问题标题】:Django View Testing Returning 301 or not foundDjango 查看测试返回 301 或未找到
【发布时间】:2016-11-29 21:47:42
【问题描述】:

我正在尝试测试视图的响应代码,但我得到 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?如果我还想输入一些查询参数怎么办?

编辑:更新以显示我用来完成我正在尝试做的事情的解决方法,尽管它可能很可怕。我发现使用转储数据和固定装置需要永远。

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 django-views django-testing


    【解决方案1】:

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

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

    【讨论】:

    • 哦,测试的东西不知道我的数据库。我试图用我的数据库中已经存在的数据来测试视图(只读的东西)。我可以用这个,谢谢!显然,我是新手。
    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2017-10-18
      • 1970-01-01
      • 2021-02-21
      • 2010-12-07
      • 2015-10-23
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多