问题标签 [python-mock]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 在 Python 中模拟修补 from/import 语句
我正在尝试让 mock.patch 处理以下示例代码:
这将输出以下内容:
这意味着 defaultdict 没有被修补。
如果我用直接导入语句替换 from/import 语句,它可以工作:
输出是:
有没有办法使用 from/import 修补呼叫?
谢谢
python - 使用导入的模块进行 python 测试
一般来说,我对使用模拟和测试还很陌生。这是我第一次尝试模拟整个导入的模块。所以例如我有
然后稍后在代码中我检查redis
如何将模拟对象或类设置到 redis 命名空间,这样我就不必在 CI 服务器上安装 redis?
python - 我应该如何在 Python 中使用 Mocks 进行测试?
我可以看到两种不同的方法将模拟注入到我想要测试的 python 代码中:
依赖注入:
允许协作类传入被测对象的构造函数,并传入模拟对象(以及必要的工厂,如 Java)
猴子补丁:
使用模拟对象工厂将被测模块中的协作类存根(这样构建协作类实际上会创建一个模拟对象)。我不需要让它们通过构造函数注入或创建任何工厂。
python 模拟库(例如mox或mock )似乎支持这两种方法。我应该在 Python 中使用哪种方法,其中一种是明智的还是有更好的方法?
python - 有什么方法可以将模拟方法重置为其原始状态?- Python 模拟 - 模拟 1.0b1
我有以下我正在模拟的简化类:
在我的第一个测试中,我只模拟了方法 A
而在我的第二个测试中,我模拟了整个检查方法:
现在我的第一个测试中的断言失败了,因为它不是在inside调用check()
和模拟,而是从我的第二个测试中调用完全模拟的。A()
check()
check()
测试后有什么方法可以清除并将方法设置为“正常”?我myClass.check.reset_mock()
已经尝试过了,但它似乎没有做任何事情。移动我的测试顺序也无济于事。
python - 如何使用nosetests从python覆盖率报告中排除模拟包
我目前尝试使用模拟库在 python 中编写一些基本的鼻子单元测试。
在完成一些基本示例后,我现在尝试使用nosetests --with-coverage
,现在我有了模拟包,我试图“模拟”的包显示在覆盖率报告中。有没有可能排除这些?
这是我要测试的课程:
和测试用例:从模拟导入补丁
我现在得到以下输出nosetests --with-coverage
有什么方法可以排除 mock 包和 imaplib 包,而无需手动将除这些包之外的所有包都列入白名单--cover-package=PACKAGE
感谢 Ned Batchelder,我现在知道了 .coveragerc 文件,谢谢!
我创建了一个包含以下内容的 .coveragerc 文件:
现在我在覆盖率报告中的模拟输出是:
它不再涵盖模拟包,但仍显示在报告中。
如果有帮助,我使用 Coverage.py,版本 3.5.2。
python - 断言未使用 Mock 调用函数/方法
我正在使用 Mock 库来测试我的应用程序,但我想断言某些函数没有被调用。模拟文档谈论类似mock.assert_called_with
and的方法mock.assert_called_once_with
,但我没有找到任何类似mock.assert_not_called
或相关的东西来验证模拟没有被调用。
我可以使用类似以下的内容,尽管它看起来既不酷也不像pythonic:
任何想法如何做到这一点?
python - 如何模拟不存在的模块的层次结构?
假设我们有一个只存在于生产阶段的模块系统。在测试这些模块的时刻不存在。但我仍然想为使用这些模块的代码编写测试。我们还假设我知道如何从这些模块中模拟所有必要的对象。问题是:如何方便地将模块存根添加到当前层次结构中?
这是一个小例子。我要测试的功能放在一个名为的文件中actual.py
:
在我的测试套件中,我已经拥有了我需要的一切:我拥有thing1_mock
和thing2_mock
. 我还有一个测试功能。我需要的是添加level1.level2...
到当前的模块系统中。像这样:
我知道我可以sys.modules['level1']
用包含另一个对象的对象替换,依此类推。但这对我来说似乎有很多代码。我认为必须有更简单和更漂亮的解决方案。我只是找不到它。
python - 仅针对一个模块使用 Mock 修补功能?
我需要修补os.listdir
和其他os
函数来测试我的 Python 函数。但是当它们被修补时,import
声明失败了。是否可以仅在单个模块(真正的模块)内修补此功能,并让 tests.py 正常工作?
这是一个打破的例子import
:
我想看real_function
一个补丁os.path
,并测试以查看正常功能。
python - 如何断言使用特定类型而不是实例调用模拟?
我正在使用最新版本的 mock 和 python 2.7.3
我正在构建我的第一个烧瓶应用程序,并且正在测试一些基本的中间件以查看 flask.abort() 是否发生(当它发生时,我断言调用了一个带有未授权异常的方法)
这是我的生产代码
我遇到的问题是模拟失败了断言,因为引发的 401 与我在断言本身中所期望的不同。
如果我只关心类型,而不关心实际实例,我该如何重写断言?
python - Django ORM - 模拟 values().filter() 链
我试图模拟 Djangosmodel.Manager()
类的链式调用。现在我想模拟values()
andfilter()
方法。
为了测试我创建了一个小测试项目:
- 创建虚拟环境
- 跑
pip install django mock mock-django nose django-nose
- 创建项目
django-admin.py startproject mocktest
- 创建应用
manage.py startapp mockme
- 添加
django_nose
和mocktest.mockme
到INSTALLED_APPS
(settings.py) - 添加
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
到 settings.py
为了验证一切都设置正确,我跑了manage.py test
。运行一项测试,这是 Django 在您创建应用程序时创建的标准测试。
接下来我要做的是创建一个非常简单的模型。
模拟/模型.py
接下来我做的是创建一个简单的函数,它使用MyModel
. 这就是我稍后要测试的功能。
模拟/functions.py
这里没有什么特别的事情发生。该函数正在过滤 MyModel 对象以查找name='Frank'
. 对 values() 的调用将返回一个ValuesQuerySet
仅包含所有找到的 MyModel 实例的名称字段。
模拟/测试.py
第一个 assertEquals 将评估为成功。由于模型管理器尚未模拟,因此没有返回任何实例。当第二个 assertEquals 被调用时,我希望result
包含我作为返回值添加到 QuerySetMock 的 MyModel 实例:
我嘲笑了filter()
方法而不是values()
方法,因为我发现它将是最后一次评估的调用,尽管我不确定。
测试将失败,因为第二个结果变量不包含任何 MyModel 实例。
为了确保该filter()
方法真的被嘲笑,我添加了一个“调试打印”语句:
返回:
我究竟做错了什么?