3

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

我正在使用 py.test 和py.test-django我的测试,并且我正在尝试对视图进行修补,以便对 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

1 回答 1

5

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

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

于 2013-03-04T13:14:55.333 回答