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”页面时,我预计此操作会失败。相反,它加载页面的正常版本并且测试成功。
有没有办法获得这种行为?或者有更好的方法来进行这些测试吗?
您正在对视图模块中的视图函数进行猴子修补。已导入该视图(对函数的引用)的任何位置仍将保留对旧(真实)视图函数的引用。
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
| 归档时间: |
|
| 查看次数: |
1510 次 |
| 最近记录: |