2013-02-27 37 views
2

我正在嘗試使用Selenium爲我的應用程序的前端行爲編寫測試。但是,我試圖測試的頁面從Solr獲取它們的數據,我不想旋轉Solr實例來運行測試。使用Django的LiveServerTestCase Monkeypatching視圖

我正在使用py.test和py.test-django我的測試,我試圖monkeypatch視圖,以便對Selenium瀏覽器發送的數據進行斷言。

例如,這是我所期望的失敗測試:

def test_search(self, live_server, browser, monkeypatch): 
    def mockview(request): 
     from django.http import HttpResponse 
     assert True == False 
     return HttpResponse('Test') 

    monkeypatch.setattr(project.app.views, 'search', mockview) 

    browser.get(live_server.url + reverse('app:search')) 

我希望當瀏覽器嘗試加載的「應用程序:搜索」這個失敗頁面。相反,它會加載正常版本的頁面並且測試成功。

有沒有辦法得到這種行爲?還是有更好的方法來處理這些測試?

回答

4

您正在修補視圖模塊中的視圖函數。任何已經導入該視圖的位置(對該函數的引用)仍將保留對舊(真實)視圖函數的引用。

Django的urlconf機制在第一個請求(可能在另一個測試用例中發生)的情況下使用真實視圖導入和配置自己。

當您更改視圖模塊中的函數時,urlconf將不會注意到它,因爲它已經保存了對舊視圖函數的引用。 Python中的Monkey修補更改名稱/引用,而不是函數本身。

您正在使用pytest的猴補丁幫手,但這個指南模擬庫文件中提供的關於申請猴子補丁一些好的信息:

http://www.voidspace.org.uk/python/mock/patch.html#where-to-patch

在這種特殊情況下,我想你最好的選擇是用靜態測試數據而不是視圖來修補Sorl-call。由於您正在進行硒測試,因此我認爲保持真實的看法是非常好的。如果你替換整個視圖,你究竟在測試什麼?

如果視圖本身包含很多特定於Sorl的代碼,您可能需要將該代碼分解爲一個單獨的函數,然後您可以輕鬆地修補它。

如果你真的想改變看法,我建議你重寫URL配置你的新觀點指向: https://pytest-django.readthedocs.org/en/latest/helpers.html#pytest-mark-urls-override-the-urlconf

+0

我會被替換的意見是JSON意見通過客戶端JS是牽強,但是打補丁Solr電話也起作用。 – rouge8 2013-03-05 20:00:02

+0

'mock'現在是Python 3的一部分,因此您可以用https://docs.python.org/3/library/unittest.mock.html#where-to-patch替換第一個鏈接 – Flimm 2016-12-28 19:30:29