问题标签 [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 回答
85 浏览

python - 为什么类的修补方法的行为与修补类的修补方法不同?

我正在玩补丁和模拟,并试图了解类方法补丁和修补类方法补丁之间的区别。在这两种情况下,我都创建了类实例并尝试通过使用显式指令的有界方法来修补绑定方法autospec=True。但是,在第一种情况下,我成功地修补了具有预期行为的方法,而在第二种情况下,修补后的对象表现出意外。

它演示了以下代码:

我预计该指令autospec=True会完成这项工作并且instance.zero.assert_called_once_with(a.y) 会通过。

应该注意的是指令autospec=True改变了mocked_b对象。

创建一个对象mocked_B<MagicMock name='B' id='...'>。然而

创建一个不同的对象mocked_B<MagicMock name='B' spec='B' id='...'>

autospec=True在修补类方法的情况下,这是对关键字参数含义的一个很好的解释:

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

https://www.toptal.com/python/an-introduction-to-mocking-in-python (见评论)

autospec=True在类修补的情况下,该指令的含义仍不清楚。

所以,我有几个问题:

  1. autospec=True在整个类修补的情况下,指令意味着什么?
  2. 为什么instance.zero.assert_called_once_with()在修补类的方法修补的情况下通过?
  3. 是否可以在第二种情况下通过有界方法修补绑定方法以便instance.zero.assert_called_once_with(a.y)通过?

更新

出现需要修补类及其方法之一的情况。

我需要测试一个类,比如说A,它在其实现中使用另一个类,比如说B。简化后看起来像这样:

我需要

  1. 检查是否使用参数调用了A像类一样a = A(config)的实例化类。Bconfig
  2. 检查调用a.run()方法 get_items 是否被调用并放入循环中。

为此我想要

  1. B用一些模拟对象修补整个类
  2. get_items用一些特殊构造的模拟对象(此处使用 side_effect 选项)修补方法,StopIteration在定义的迭代次数后引发异常。

当然,do_some_action方法也是打补丁的。

0 投票
0 回答
47 浏览

python - 我可以在测试我的函数时模拟“open”(和其他内置函数)吗?

在编写单元测试时,我可以unittest.mock用来隔离依赖关系并监控模拟函数的使用。我可以对内置函数的调用做同样的事情吗?

特别是,最好模拟open()一下,这样我就可以在不涉及磁盘文件的情况下提供测试输入或监视输出。这是可能的,并且值得建议吗?(我已经知道对于接受打开的文件对象而不是文件名的函数,无需模拟即可完成此操作。)

0 投票
1 回答
6010 浏览

python - 如何在python中对数据库连接pymysql进行单元测试?

我正在尝试编写单元测试用例来通过模拟数据库来测试以下方法。如何在不实际连接到真实数据库服务器的情况下模拟数据库连接。我尝试了示例测试用例。我不确定这是否是正确的方法。如果我错了,请纠正我。

0 投票
3 回答
24863 浏览

python - Python 单元测试:如何对包含数据库操作的模块进行单元测试?

我正在使用 pymysql 客户端库连接到真实的数据库。我在模块中有一个函数,我使用 pymysql 连接到数据库并且只执行数据库插入操作。如何在 python 中对这个函数进行单元测试而不打到真正的数据库?

我的python版本是2.7。

0 投票
2 回答
2498 浏览

python - Python:在测试函数的同一模块中定义的修补函数

我一直在使用 Python 的unittest.mock库,但现在我正在努力解决一个可能无法正确处理的用例。

考虑一个mymodule/code.py包含以下代码段的文件:

我想测试foo功能,修补sum功能,然后保持mul原样div。这是我最初尝试的:

但是,上面说明的修补方法不起作用。我相信该sum函数在加载时已正确修补mymodule.code.py,但由于def sum()块而重新定义。

通过阅读官方文档,我也尝试使用该库的startstop函数unittest.mock如下:

这种方法也没有奏效。我希望它会在文件加载sum后避免函数覆盖。modules/code.py

是否可以修补本地功能,例如sum?或者将sum函数移动到另一个文件是修补的唯一选项?

提前谢谢了!

0 投票
1 回答
47283 浏览

python - python 模拟 assert_call_with

我试图理解assert_called_with内部模拟,但我编写的代码引发了一些错误。

单元测试

我试图理解assert_called_with这里是做什么的?

0 投票
1 回答
3666 浏览

python - 使用 unittest.mock 在 python 中修补 SMTP 客户端

我想模拟 SMTP 客户端表单的生成smtplib。以下代码:

返回

暗示补丁失败。

编辑:有趣的是,这里描述的猴子补丁给出了相同的结果。

0 投票
2 回答
1400 浏览

python - Python:从 unittest.mock 解压 call_args_list

我想解开模拟方法的参数。我有一个被测试代码调用的模拟订阅者,我想验证 notify() 方法的调用。

我正在使用以下代码段来解压缩参数并验证两个调用:

但是解包事件的两行代码非常笨拙,并且与可读代码相差甚远。有人知道解开论点的更好方法吗?

非常感谢!

0 投票
1 回答
4263 浏览

python - Python模拟:AssertionError:预期和实际调用不同

我是 unittest.mock 库的新手,无法解决我遇到的问题。我在下面的文件夹结构中有一个名为“function.py”的类

  • src_init .py _
    • 函数.py
  • 测试
    • 初始化.py
    • test_function.py

在 test_function.py 我有一些这样的代码:

在function.py中:

如果我运行它,我会得到以下异常:

提前感谢您帮助我。

0 投票
5 回答
5910 浏览

pytest - 嘲笑雪花连接

我在 python 中有一个 SnowflakeApi 类,它只是作为 SnowflakeConnection 类之上的包装器。我的 SnowflakeApi 是

SnowflakeApi 的命名空间是 connection.snowflake_connection.SnowflakeApi(即我在名为 connections 的文件夹中有 snowflake_connection.py)

我想使用 pytest 和 unittest.mock 为这个类编写单元测试。问题是我想模拟“连接”,以便返回一个 MagicMock 对象并且不进行数据库调用。到目前为止,我已经尝试过:

  1. monkeypatch.setattr(connections.snowflake_connection,"connect",return_value = "")
  2. 将我原来的课程改为只导入雪花。然后我创建了一个模拟对象并使用了 monkeypatch.setattr(snowflake_connection,"snowflake",my_mock_snowflake)。那也没用

简而言之,我尝试了其他一些方法,但没有任何效果。我想做的只是模拟雪花连接,因此不会进行实际的数据库调用。