2016-11-29 48 views
0

我試圖測試視圖的響應代碼,但我要麼301或不存在。Django查看測試返回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

第一個不起作用,因爲Django使用最終斜槓重定向到版本。

第二個告訴你爲什麼它不起作用:你還沒有在測試中創建一個ID爲123的物品 - 或者實際上是任何物品。

+0

OH,測試的東西不知道我的數據庫。我試圖用已經在我的數據庫中的數據測試視圖(只讀的東西)。我可以與此合作,謝謝!顯然,我是新手。 – user3449833

1

考慮測試它的存在之前創建對象:

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)