使用 Django 的 LiveServerTestCase 对视图进行 Monkeypatching

rou*_*ge8 3 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'))
Run Code Online (Sandbox Code Playgroud)

当浏览器尝试加载“app:search”页面时,我预计此操作会失败。相反,它加载页面的正常版本并且测试成功。

有没有办法获得这种行为?或者有更好的方法来进行这些测试吗?

and*_*lme 5

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

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

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

您正在使用 pytest 的 Monkeypatch 帮助程序,但是模拟库文档中的本指南提供了一些有关在何处应用 Monkey 补丁的好信息:

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- urlconf

  • `mock` 现在是 Python 3 的一部分,因此您可以将第一个链接替换为 https://docs.python.org/3/library/unittest.mock.html#where-to-patch (2认同)