问题标签 [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.

0 投票
3 回答
28503 浏览

python - 在 Python 中模拟修补 from/import 语句

我正在尝试让 mock.patch 处理以下示例代码:

这将输出以下内容:

这意味着 defaultdict 没有被修补。

如果我用直接导入语句替换 from/import 语句,它可以工作:

输出是:

有没有办法使用 from/import 修补呼叫?

谢谢

0 投票
1 回答
130 浏览

python - 使用导入的模块进行 python 测试

一般来说,我对使用模拟和测试还很陌生。这是我第一次尝试模拟整个导入的模块。所以例如我有

然后稍后在代码中我检查redis

如何将模拟对象或类设置到 redis 命名空间,这样我就不必在 CI 服务器上安装 redis?

0 投票
2 回答
1637 浏览

python - 我应该如何在 Python 中使用 Mocks 进行测试?

我可以看到两种不同的方法将模拟注入到我想要测试的 python 代码中:

  1. 依赖注入:

    允许协作类传入被测对象的构造函数,并传入模拟对象(以及必要的工厂,如 Java)

  2. 猴子补丁:

    使用模拟对象工厂将被测模块中的协作类存根(这样构建协作类实际上会创建一个模拟对象)。我不需要让它们通过构造函数注入或创建任何工厂。

python 模拟库(例如moxmock )似乎支持这两种方法。我应该在 Python 中使用哪种方法,其中一种是明智的还是有更好的方法?

0 投票
2 回答
37806 浏览

python - 有什么方法可以将模拟方法重置为其原始状态?- Python 模拟 - 模拟 1.0b1

我有以下我正在模拟的简化类:

在我的第一个测试中,我只模拟了方法 A

而在我的第二个测试中,我模拟了整个检查方法:

现在我的第一个测试中的断言失败了,因为它不是在inside调用check()和模拟,而是从我的第二个测试中调用完全模拟的。A()check()check()

测试后有什么方法可以清除并将方法设置为“正常”?我myClass.check.reset_mock()已经尝试过了,但它似乎没有做任何事情。移动我的测试顺序也无济于事。

我正在使用来自http://pypi.python.org/pypi/mock/的 python 模拟 1.0b1

0 投票
3 回答
13386 浏览

python - 如何使用nosetests从python覆盖率报告中排除模拟包

我目前尝试使用模拟库在 python 中编写一些基本的鼻子单元测试。

在完成一些基本示例后,我现在尝试使用nosetests --with-coverage,现在我有了模拟包,我试图“模拟”的包显示在覆盖率报告中。有没有可能排除这些?

这是我要测试的课程:

和测试用例:从模拟导入补丁

我现在得到以下输出nosetests --with-coverage

有什么方法可以排除 mock 包和 imaplib 包,而无需手动将除这些包之外的所有包都列入白名单--cover-package=PACKAGE

感谢 Ned Batchelder,我现在知道了 .coveragerc 文件,谢谢!

我创建了一个包含以下内容的 .coveragerc 文件:

现在我在覆盖率报告中的模拟输出是:

它不再涵盖模拟包,但仍显示在报告中。

如果有帮助,我使用 Coverage.py,版本 3.5.2。

0 投票
7 回答
130959 浏览

python - 断言未使用 Mock 调用函数/方法

我正在使用 Mock 库来测试我的应用程序,但我想断言某些函数没有被调用。模拟文档谈论类似mock.assert_called_withand的方法mock.assert_called_once_with,但我没有找到任何类似mock.assert_not_called或相关的东西来验证模拟没有被调用

我可以使用类似以下的内容,尽管它看起来既不酷也不像pythonic:

任何想法如何做到这一点?

0 投票
2 回答
2353 浏览

python - 如何模拟不存在的模块的层次结构?

假设我们有一个只存在于生产阶段的模块系统。在测试这些模块的时刻不存在。但我仍然想为使用这些模块的代码编写测试。我们还假设我知道如何从这些模块中模拟所有必要的对象。问题是:如何方便地将模块存根添加到当前层次结构中?

这是一个小例子。我要测试的功能放在一个名为的文件中actual.py

在我的测试套件中,我已经拥有了我需要的一切:我拥有thing1_mockthing2_mock. 我还有一个测试功能。我需要的是添加level1.level2...到当前的模块系统中。像这样:

我知道我可以sys.modules['level1']用包含另一个对象的对象替换,依此类推。但这对我来说似乎有很多代码。我认为必须有更简单和更漂亮的解决方案。我只是找不到它。

0 投票
4 回答
6335 浏览

python - 仅针对一个模块使用 Mock 修补功能?

我需要修补os.listdir和其他os函数来测试我的 Python 函数。但是当它们被修补时,import声明失败了。是否可以仅在单个模块(真正的模块)内修补此功能,并让 tests.py 正常工作?

这是一个打破的例子import

我想看real_function一个补丁os.path,并测试以查看正常功能。

这是回溯

0 投票
1 回答
515 浏览

python - 如何断言使用特定类型而不是实例调用模拟?

我正在使用最新版本的 mock 和 python 2.7.3

我正在构建我的第一个烧瓶应用程序,并且正在测试一些基本的中间件以查看 flask.abort() 是否发生(当它发生时,我断言调用了一个带有未授权异常的方法)

这是我的生产代码

我遇到的问题是模拟失败了断言,因为引发的 401 与我在断言本身中所期望的不同。

如果我只关心类型,而不关心实际实例,我该如何重写断言?

0 投票
2 回答
10294 浏览

python - Django ORM - 模拟 values().filter() 链

我试图模拟 Djangosmodel.Manager()类的链式调用。现在我想模拟values()andfilter()方法。

为了测试我创建了一个小测试项目:

  1. 创建虚拟环境
  2. pip install django mock mock-django nose django-nose
  3. 创建项目django-admin.py startproject mocktest
  4. 创建应用manage.py startapp mockme
  5. 添加django_nosemocktest.mockmeINSTALLED_APPS(settings.py)
  6. 添加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()方法真的被嘲笑,我添加了一个“调试打印”语句:

返回:

我究竟做错了什么?