首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Errbot修补(模拟)测试?

如何用Errbot修补(模拟)测试?
EN

Stack Overflow用户
提问于 2017-10-29 19:32:38
回答 1查看 119关注 0票数 0

我正在尝试用我的跑步机测试来修补依赖项。我遇到的问题是errbot如何导入模块。它不是静态的,当我添加测试或以不同的顺序进行测试时,它会破坏我的修补程序。

我有一个叫做EDB (edb.py)的插件。在edb.py内部,我使用import pyedb导入pyedb。这个位于我的site-packages中。

我有我的测试文件test_edb.py,我尝试像这样修补我的测试方法

代码语言:javascript
复制
pytest_plugins = ["errbot.backends.test"]
extra_plugin_dir = '.'

from unittest.mock import patch  # noqa: E402

@patch('yapsy_loaded_plugin_EDB_1.pyedb', autospec=True)
def test_edb_testlist(pyedb_mock, testbot):
    testbot.push_message('!edb testlist')

    assert "Okay, let me get..." == testbot.pop_message()
    assert "I don't see any..." == testbot.pop_message()

Errbot为模块导入添加了这个yapsy_loaded_plugin_EDB_<xx>路径,但是xx取决于测试的运行顺序。这不起作用,我需要一些静态导入路径mypath.pyedb

我希望有一种不同的方法来解决这个问题。也许我可以改变导入模块的方式,这样它就不依赖于errbot导入了?

这里有一个指向Errbot测试的链接以供参考。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-30 12:04:53

我的解决办法有点烦琐,但有效。如果有人有一个更优雅的解决方案,请分享。如果没有更多的答复,我会接受我自己的回答。

因此,我以前曾遇到过这种情况,但我想我仍然不太熟悉Python中的修补程序是如何工作的,因为我知道应该在哪里进行修补。在阅读了"打补丁的地方“文档(同样是:)之后,考虑到带有errbot的动态导入,我做了一个工作。

一个errbot项目文件夹会看上去

代码语言:javascript
复制
errbot-project/
├── data/
│   ├── ...
├── plugins/
│   ├── plugin1/
|       ├── ...
|   ├── plugin2/
|       ├── ...

我注意到,当errbot运行时,项目目录../errbot-project和所有插件目录(例如../errbot-project/plugins/plugin1)都会添加到sys.path中。

因此,我将一个包添加到我的项目目录中,并将其导入到我的插件中。然后,我可以从该包中可靠地修补我的依赖项。同样,请阅读补丁在哪里?文档以获得完整的解释。看上去像这样。

代码语言:javascript
复制
errbot-project/
├── data/
│   ├── ...
├── plugins/
│   ├── plugin1/
|       ├── ...
|   ├── plugin2/
|       ├── ...
├── plugin_deps/
|       ├── __init__.py

我的../errbot-project/plugin_deps/__init__.py看起来就像

代码语言:javascript
复制
...
import dep1
import dep2
...

然后在我的插件中使用

代码语言:javascript
复制
...
import plugin_deps as pdep
...
def method():
    pdep.dep1.method()
...
# note, you cannot use 
# from plugin_deps import dep1
# this changes 'where' python looks up the module and
# and 'breaks' your patch 

最后,我的测试代码看起来像

代码语言:javascript
复制
@patch('plugin_deps.dep1', autospec=True) 
def test_get_tl_tabulation(my_mock, testbot):
    # test code here
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47004386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档