问题标签 [python-unittest.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 投票
0 回答
130 浏览

python - 如何从 Mock 实例方法访问 TestCase 实例方法?

TL;博士

我可以unittest.TestCase从模拟类的方法中访问当前实例而不显式传递该实例吗?TestCase如果不是,从那里访问(实例方法)的断言辅助函数的正确方法是什么?(有合适的​​方法吗?)

Szenario:使用我自己的基于方法MagicMock的断言方法进行增强TestCase

我想测试一个函数()是否正确handle_multiple_foobars()使用了另一个函数(handle_one_foobar()),所以我在嘲笑handle_one_foobar()。这里的“正确”意味着handle_multiple_foobars()应单独调用handle_one_foobar()其每个参数。(handle_one_foobar()每个handle_multiple_foobars()参数一个调用。)我不关心调用的顺序。

检查是否已对模拟进行了所有预期的调用

因此,我从这个开始:

检查是否对模拟进行了预期的调用

但是,如果对模拟函数有更多调用,这也会通过,例如

我不想要那个。

我可以很容易地编写一个额外的断言(或一个额外的测试)来检查调用的总数。但我希望这被视为一个单一的条件来测试。所以我构建了一个不同的断言:

这将很好地捕获额外的调用:

将新断言移动到模拟的辅助方法中

但就我的口味而言,这里所断言的内容还不够明显。因此,我决定将断言提取到一个新函数中。因为这个函数的作用和 非常相似assert_has_calls(),我觉得应该是mock类的一个方法。扩展并不难MagicMock,我们甚至可以使提取的方法更通用,以允许指定调用顺序是否重要:

@patch当我将测试方法装饰更改为时,将使用此类而不是unittest.mock.MagicMock创建模拟

然后我可以把我的断言写成

...和丑陋的

但是您可能已经注意到一些非常丑陋的事情:为了能够使用TestCase实例方法assertCountEqual()assertEqual(),我创建了一个虚拟TestCase实例,它不是运行测试的真实FoobarHandlingTest实例。

我怎样才能避免这种情况?

显然,我可以将测试传递给self断言方法,但这会导致非常不直观的签名。(为什么我必须对我的测试用例进行断言?)

0 投票
1 回答
3178 浏览

python - UnitTest Python Mock 第一次调用方法,第二次调用照常进行

我在嘲笑一种方法。我想在第一次调用时引发异常,但是在异常时,我再次使用不同的参数调用该方法,所以我希望第二次调用能够正常处理。我需要做什么?

代码

试试 1

试试 2

在第二次调用时,some_method按原样返回,并且不使用不同的参数处理数据。

0 投票
1 回答
1972 浏览

python - 检查 unittest.mock 调用参数是否已作为位置参数或关键字参数传递

当一个unittest.mock.Mock对象被调用时,我可以使用调用的确切签名检查参数值:

检查具有相同值的不同签名将失败。例如,如果我们将 with'baz'作为位置参数而不是命名参数进行检查,则断言将失败:

它必须。如果被替换的函数m

那么调用将是等效的,但如果是

那么电话将不等价。Mock不知道实际函数的签名,所以它不能依赖我们在第一种情况下的等价性。

有没有一种方法可以通过让 Mock(或断言辅助函数或类似函数)知道被模拟替换的实际函数来检查调用参数值,这些值是按位置传递还是作为关键字参数传递的?

可以使用可选参数或使用autospeccing使对象知道它替换的Mock对象(可以是函数或方法),但它们用于不同的目的(限制在模拟上允许的调用)并且不影响之后- 事实检查。spec

0 投票
3 回答
8040 浏览

python - 似乎调用了 Python 补丁模拟,但断言失败

我正在使用 Python 2.6.6

我想要做的是用 Mock 替换对象的创建,以确保进行正确的调用。应该直截了当。

我的模块:

我的测试:

输出是:

然而测试失败了:

我不明白模拟是如何报告调用的,但我不能断言它们被调用了。我错过了什么?

编辑:在添加了所有指标的报告之后,我似乎对 python 模拟有一些基本的误解。如果 foo() 在调用列表中,那么为什么调用计数只有 1,为什么 foo.call 报告 'False'?

0 投票
1 回答
144 浏览

python - 在 unittest.mock 中加倍对象

我正在尝试使用 unittest 和 unittest.mock 在我的应用程序中进行一些测试。

我有两个类 MainClass 和 Caller。我想用双调用者测试主类。简而言之,这就是我所拥有的:

在我做的测试中:

然而问题是没有注释行实际上改变了我的function2的返回值。我怎样才能做到这一点?

我也会对不需要双精度且调用者的所有函数都返回 None 并且我必须在特定测试中指定函数的返回值的解决方案感到满意。

0 投票
4 回答
10219 浏览

python-3.x - Python asyncio:如何模拟 __aiter__() 方法?

我有一个代码正在使用aiohttp.

看起来像:

原始代码ws的实例在哪里aiohttp.web.WebSocketResponse()

在我的测试中,我模拟WebSocketResponse()了它的__aiter__方法:

虽然当我运行测试时它失败并显示错误消息:

'async for' 需要一个带有__aiter__方法的对象,得到了 MagicMock

所以它的行为就像__aiter__()从未被嘲笑过。在这种情况下,我应该如何完成正确的模拟?


更新:

现在我已经找到了一种使代码可测试的解决方法,但如果有人告诉我如何处理原始问题中描述的问题,我将不胜感激。

0 投票
1 回答
344 浏览

python - 来自 hamcrest.contains_inanyorder 的几乎无用的断言输出应用于 unittest.mock.Mock.mock_calls

通常,我关心被测系统对软件的另一部分(我在测试中模拟)进行的确切调用,而不关心这些调用发生的顺序。(例如,因为模拟替换的真实其他部分的最终效果不取决于这些调用的顺序。)

换句话说,我希望我的测试

  • 如果没有进行所有预期的调用,则失败
  • 如果进行了意外调用,则失败(因此unittest.mock.Mock.assert_has_calls还不够)
  • 如果只有调用的顺序发生变化,则不会失败
  • 如果拨打电话的频率低于或高于预期,则失败

所以,我必须检查模拟对象的mock_calls属性。我可以使用 PyHamcrest 以一种通用且合理理解的方式做到这一点contains_inanyorder

这适用于通过测试,例如上面的测试:

当它应该失败时它也会失败(如上所述,例如当您将其中一个更改为时m('foo')m('F00'),但在这种情况下的输出并不像它可能的那样有用:

我可以从中收集的唯一信息(除了哪个测试和哪个断言失败)是总共预期有多少次模拟调用(通过计算方括号之间的逗号),但不是预期的调用,更多重要的是,实际观察到了哪些电话以及多少电话。

这是unittest.mockPyHamcrest 中的错误还是我使用错误?

0 投票
2 回答
1052 浏览

python - 当生产类构造函数采用额外参数时,为什么 unittest.mock 会失败?

我遇到了一个问题,我认为这可能是我正在使用的库的错误。但是,我对 python、unittest 和 unittest.mock 库还很陌生,所以这可能只是我理解的一个漏洞。

在向某些生产代码添加测试时遇到错误,我生成了一个最小示例来重现该问题:

我如何运行测试和输出如下:

我正在使用 python 2.7.11,通过 pip 安装了模拟版本 2.0.0。

关于我做错了什么有什么建议吗?或者这看起来像图书馆中的错误?

0 投票
0 回答
1271 浏览

python - 这是否可以检查是否使用参数列表之一调用模拟

假设我们有一些方法:

和方法调用者:

我想测试self.sleep被调用的wait_timers. 所以可能的选择:

首先是我现在使用的:patchrandom.choice总是返回第一个元素,然后使用 mock 的assert_has_calls.

第二种选择是观察random.choice并查看需要wait_timers的是否通过。这两个选项都要求我模拟两个对象。所以我徘徊是否unittest.mock允许检查是否某些参数之一被传递给函数以减少模拟数量,例如

0 投票
1 回答
304 浏览

python - 如何使用 unittest 修补方法 io.RawIOBase.read?

我最近了解了unittest.monkey.patch它的变体,我想用它来单元测试文件读取函数的原子性。但是,该补丁似乎没有任何效果。

这是我的设置。推敲的方法大致是这样的(略):

以及执行单元测试的模块(也被删减了):

这样,补丁应该确保每次您尝试读取它时,文件都会在实际读取之前和之后被修改,就好像它同时发生一样,从而测试我们读取的原子性。

单元测试当前成功,但我已经用打印语句验证了补丁函数实际上并没有被调用,所以文件永远不会得到额外的写入(它只是说“测试”)。我还故意将代码修改为非原子的。

所以我的问题是:如何修补readlocal_storage 模块内的 IO 句柄功能?我在其他地方读到人们倾向于替换 open() 函数以返回类似 a 的东西StringIO,但我不明白这如何解决这个问题。

我需要支持 Python 3.4 及更高版本。