使用Django的LiveServerTestCase进行Monkeypatching视图

时间:2013-02-27 18:07:17

标签: django monkeypatching django-testing pytest

我正在尝试使用Selenium为我的应用程序的前端行为编写测试。但是,我试图测试的页面从Solr获取数据,我不想启动Solr实例来运行测试。

我正在使用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'))

当浏览器尝试加载“app:search”页面时,我希望这会失败。相反,它加载正常版本的页面,测试成功。

有没有办法解决这个问题?或者有更好的方法来进行这些测试吗?

1 个答案:

答案 0 :(得分:4)

您正在修补视图模块中的视图功能。任何已导入该视图的位置(对该函数的引用)仍将保留对旧(实际)视图函数的引用。

Django的urlconf机制在第一次请求时导入并使用真实视图进行配置(可能在另一个测试用例中发生)。

当您更改视图模块中的函数时,urlconf将不会注意到它,因为它已经拥有对旧视图函数的引用。用Python修补猴子会改变名称/引用,而不是函数本身。

您正在使用pytest的monkeypatch助手,但是模拟库文档中的这个指南提供了有关应用猴子补丁的位置的一些很好的信息:

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

在这种特殊情况下,我认为最好的办法是使用静态测试数据修补Sorl调用,而不是视图。由于您正在进行Selenium测试,我认为保持真实视图会非常好。如果替换整个视图,你实际测试的是什么?

如果视图本身包含许多特定于Sorl的代码,您可能希望将该代码分解为单独的函数,然后您可以轻松地将其修补。

如果您真的想要更改视图,我建议您覆盖urlconf以指向新视图: https://pytest-django.readthedocs.org/en/latest/helpers.html#pytest-mark-urls-override-the-urlconf