2013-02-27 19 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