2013-10-23 43 views
0

我想測試一些django應用程序的URL。但是,關聯的視圖鏈接到數據庫。我想要做的是嘲笑視圖方法的這些方面,但我不知道如何。如何在使用Django測試URL時模擬數據庫訪問

假設我想嘗試/signin url,這是一種古典的簽名形式。 相關的觀點是這樣的:

def login(request): 
    if 'user' in request.session: 
     return redirect(reverse("home")) 
    if request.method == 'POST': 
     form = LoginForm(request.POST) 
     if form.is_valid(): 
      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password'] 
      return treat_login(request, username, password) # checks if couple 
                   is present in 
                   database, returns 
                   pages accordingly 
    else: 
     form = LoginForm() 
    return render(request, 'login.html', {'form':form, }) 

在我的測試,我必須將login方法沒有隱式調用,因爲我只用url

class Tests_urls(TestCase): 
    def test_signin(self): 
     self.client.post(reverse("login"), {"username":"login", "password":"pwd"}) 
     self.assert_http_status(url, status, "after a standard login") 

與測試的問題是,它需要一個數據庫來執行,這是我想要避免的(我不能使用嵌入式測試數據庫)。

因此,我想知道如何從測試的角度嘲笑treat_login方法。

回答

2

您可以使用補丁從mock libarary

from mock import patch 

class Tests_urls(TestCase): 
    @patch('my_app.views.treat_login') 
    def test_signin(self, mock_treat_login): 
     self.client.post(reverse("login"), {"username":"login", "password":"pwd"}) 
     self.assert_http_status(url, status, "after a standard login") 
     self.assertTrue(mock_treat_login.called) 

您還可以檢查調用了args。但是你寫這個測試的方式會讓你感覺有些困難。如果您使用的request factory,並通過執行類似

request = self.factory.post(
    reverse("login"), {"username":"login", "password":"pwd"}) 

response = login(request 

mock_treat_login.assert_called_once_with(request, "login", "pwd) 

測試的功能,那麼你實際上可以確保你正確地調用它。

+0

看起來很有希望,我馬上檢查一下。 – fxm