问题标签 [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 投票
2 回答
348 浏览

python - 断言对不同模拟对象的一系列调用

如何使用 Pythonmock库断言对不同模拟对象的特定调用序列?

例如,我想断言:

  • 一个电话foo(spam, eggs);然后
  • 一个电话bar(beans, ham);然后
  • 的呼唤foo(sausage)

我可以修补每个fooand bar,并且生成的模拟对象每个都允许我对对该模拟的调用进行断言。但是我需要访问整个调用序列来对该序列进行断言。

是的,理想情况下,我只需要检查结果状态并在事后对其进行断言。但这对于某些系统是不可行的,正确状态的唯一可行描述是“这些调用是按照这个特定的顺序进行的”。

我可以使用库的哪些功能mock来访问对不同对象的一系列调用,并断言调用按正确的顺序进行?

0 投票
1 回答
1665 浏览

python - Mock 的 autospec 将错误的参数注入到被调用的函数中

我的理解是,autospec这里使用的最简单的形式将检查正在模拟的函数的签名与提供的参数。其目的是在它们不匹配时引发错误。在下面的代码中,它似乎注入了一个额外的参数——对象本身。为什么使用模拟模块会autospec导致此处显示的意外行为?对于这个问题,我在模块中创建了一个简化版本simplebutton。当它作为主模块运行时,会打印“这不是开玩笑”这一行。

测试模块test_simplebutton包含两个测试都有效。两者都模拟了该callback功能。然而,第二个测试包括autospec=True.

在这个测试中,应该不带参数调用的回调函数必须用参数调用,dialog否则测试失败。

编辑: 每个人都知道您不是通过调用方法method(instance)而是通过调用方法instance.method()。那是我的错误。在这里,它需要是模拟在instance1.method('instance2')哪里,并且是包含模拟方法的对象。感谢 Michele d'Amico。instance1instance2

测试套件如下:

0 投票
1 回答
968 浏览

python - 使用大小变量的模拟文件读取方法

我正在尝试使用 python 模拟库模拟文件。虽然很简单,但我仍然不明白如何在必须接收大小参数时模拟读取函数。我试图使用 side_effect 创建一个替代函数,该函数将读取作为值传递的足够数据。

这是这样的想法:

但是,我还没有弄清楚如何将阅读器的当前位置存储在 side_effect 函数中,然后再阅读。我认为可能有更好的方法,但我仍然想通了。

0 投票
1 回答
150250 浏览

python - 模拟函数以引发异常以测试 except 块

我有一个函数 ( foo),它调用另一个函数 ( bar)。如果调用bar()引发了HttpError,如果状态码是 404,我想特别处理它,否则重新引发。

我正在尝试围绕这个foo函数编写一些单元测试,模拟对bar(). 不幸的是,我无法获得模拟调用来bar()引发我的except块捕获的异常。

这是我的代码,它说明了我的问题:

我遵循了Mock 文档,其中说您应该将实例的 设置为side_effect类以使模拟函数引发错误。MockException

我还查看了其他一些相关的 StackOverflow 问答,看起来我正在做与他们正在做的事情相同的事情,以导致他们的模拟引发异常。

为什么设置side_effectbarMock导致预期Exception提高?如果我在做一些奇怪的事情,我应该如何在我的except块中测试逻辑?

0 投票
1 回答
547 浏览

python - 如何在单元测试中使用 Python 模拟

大多数关于 Python 模拟的建议都包含在单元测试框架之外的简短片段中。这个工作发现,我正在尝试遵循这个建议,但是一旦我将它嵌入到适当的单元测试中,它就不会成功。例如,这段代码在最后的注释中产生输出:

我在 PyDev 中运行并查看:

删除单元测试框架,这段代码运行良好(这里,只是整个文件的test.py部分):

运行时成功产生:

我还必须做些什么才能使其在单元测试框架中运行?

0 投票
1 回答
363 浏览

python - Python Mock 与 `from X import y`

我试图mock在我的单元测试中使用 Python 的库,但我看到的结果不一致,这取决于我如何导入我试图修补的目标。我希望这两个打印语句都应该返回False,但似乎只有第二个语句返回False

0 投票
1 回答
3603 浏览

python - 在 python 模拟中返回或中断作为副作用?

我有一个多处理应用程序,它的工作人员在“while True”循环中运行。对于测试,我希望能够以这样的方式模拟 sys.exit() :

或者

所以我可以跳出循环并完成我的测试。这些都不起作用,但是有没有不同的方法来做我想要完成的事情?

0 投票
1 回答
138 浏览

python - 当 Python 模拟函数调用时,是否有打印语句?

我现在正在尝试使用 mock.patch 模拟一个函数,例如:

现在我想让 MyClassMethod 打印“hello word!!” 当它被调用时。谁能帮我找到解决方案。

提前致谢,

0 投票
1 回答
2436 浏览

python - 用于具有动态属性的 isinstance 检查的模拟类

一些类在类级别(外部__init__或任何其他功能)定义它们的属性(又名字段)。一些类在它们的__init__函数中甚至从其他函数中定义它们。有些类同时使用这两种方法。

问题是,当您使用 时dir,它仅包括'bar'您传入类的实例。

(滚动到最右边查看差异)

我有一种情况,我需要避免实例化MyClass,但我想将它用作单元测试调用中的spec设置(通过isinstance检查) 。mock.patch

这样做会导致:

AttributeError:模拟对象没有属性“bar”

这是有道理的,因为模拟文档说:

规范:这可以是字符串列表,也可以是充当模拟对象规范的现有对象(类或实例)。如果您传入一个对象,则通过在该对象上调用 dir 来形成一个字符串列表(不包括不受支持的魔法属性和方法)。访问不在此列表中的任何属性都会引发 AttributeError。

即使我实例化MyClass了,我也会得到一个不同的错误。

原因:

TypeError:“NonCallableMagicMock”对象不可调用

我并不真正关心我允许访问哪些功能/属性;我实际上想要正常的 MagicMock 行为,它可以让你在没有AttributeError. spec尽管我只是spec用来通过isinstance检查,但似乎 using使这个变得严格。

问题:

如何正确模拟这个在isinstance检查中使用并且具有未在类级别定义的属性的类?

0 投票
2 回答
3982 浏览

python - 使用 python 的 mock 从 dict 中临时删除一个对象

我正在为一些检查值的代码编写测试os.environ(我知道这不是最佳的,但我必须接受它)。我想在测试期间从 os.environ 中删除一个条目。我不确定 mock 是否支持这一点。我知道patch.dict可以用来修改一个项目,但我想删除键/值对。我想要一些类似的东西:

有没有办法完成这样的壮举?