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

python-3.x - 如何使用 python 的 unittest mock 构建单元测试用例?

基类具有子类继承并调用它们的方法。基类的方法反过来调用 util 类中存在的方法。

我希望拿出一个单元测试套件来测试整个流程,而不仅仅是使用 unittest mock 的单一方法

0 投票
2 回答
666 浏览

python - Python unittest.mock:调用了修补类方法但断言失败

我正在尝试模拟实用程序类的几个组件。虽然assert_called()一种方法可以,但另一种方法失败,但我确信两者都被调用。我在 Windows 10 上运行 Python 3.7.3。

我已经将我的场景简化为基本要素。实用程序类 ( util.py):

工作正常的单元测试变体:

失败的那个:

运行测试时,我得到两个print()输出:

所以我确信这两种方法都被调用了。

很可能我犯了一些愚蠢的错误,因为我对python真的很陌生......

更多背景:

在我的精简场景do_something()中,只是一组函数的替身,这些函数是我的测试对象,而在我的真实场景中,这些函数实际上是在单独的 python 文件中定义的。在生产环境中,它在提供实用程序类 api 的框架的上下文中运行。在我的测试环境中util.py,它本身就是生产 api 的模拟。要测试的 py 文件(而不是def do_something(): ...)加载如下:

因此,我无法修改do_something()测试场景中的代码。

0 投票
0 回答
333 浏览

python - 我应该如何测试模拟对象的方法

我有一个关于如何模拟嵌套方法并测试它被调用的问题。我很难理解:https ://docs.python.org/3/library/unittest.mock-examples.html#mocking-chained-calls 。

我想测试一下这个类中的 deploy_file 方法是否调用了 fabric 库中的“put”方法,也许给它赋予了什么值。这是从 AWS 收集一些信息并提供对数据采取行动的方法的模块。

“get_secret”是另一个模块中的一个方法,它使用 boto3 库从 AWS 获取信息。

这些是我正在进行的测试:

其中第二个测试导致“AssertionError:预期的'put'已被调用一次。调用了 0 次。”

第一个测试模拟了“get_secret”函数,以测试“Deploy”的构造函数是否从假 AWS 数据中设置了“Deploy.secrets”。

在第二个测试中,get_secrets 像以前一样被模拟,我模拟了结构库中的“连接”。如果我不模拟 Connection,则会在创建 Connection 对象时收到与“host”参数相关的错误。

我认为当调用“conn.put”时,它会创建一个全新的 Mock 对象,并且在 unittest 运行时我没有测试该对象。我只是不确定如何定义测试来实际测试 put 的调用。

我也是了解要测试什么(以及如何测试)和不测试什么以及如何使用模拟等方面的新手。不过,我完全接受了这个想法。在我从事项目工作时,发现错误和回归非常有帮助。

0 投票
0 回答
453 浏览

django - 如何在 django 单元测试中模拟 celery send_task 函数

我想在 Django 中为具有 celery send_task 函数的函数编写单元测试。

我如何在 Django 和模拟 celery 中编写它的 UT?

0 投票
2 回答
858 浏览

python - 如何在实例级别模拟 Python 属性?

正如unittest.mock 文档指出的那样:

由于模拟属性的存储方式,您不能直接将 PropertyMock 附加到模拟对象。相反,您可以将其附加到模拟类型对象

但是,我遇到了想在单个测试中模拟多个类实例上的多个属性值的情况。

例如,假设我有一个TimeSlot带有availability属性的类:

...而且我有一个帮助类,它按以下方式对TimeSlot实例列表进行排序availability

当我尝试将 Mock(或 PropertyMock)分配给属性时,运行此测试会引发错误availability

AttributeError: can't set attribute

有没有办法模拟Python 类的每个实例的属性返回值?

如果没有,我应该以不同的方式来编写这样的单元测试吗?

谢谢!

0 投票
1 回答
290 浏览

python - 使用 @patch() 模拟和不使用 side_effect 有什么区别?

我有一个script.py文件:

和一个test.py文件:

我可以pytest test.py从命令行成功运行。

如果我想side_effect在 my中使用@patch,我必须做一些不同的事情:

即,我必须:

  • 添加一个test_my_basic_function我从不使用的参数。
  • callfourth_function而不是third_function,因为我不能使用任何类实例变量。

这两种方式打补丁有什么区别?

0 投票
0 回答
83 浏览

python - 如何仅针对某些参数模拟对象/方法

我正在编写一个测试,断言使用某些参数调用某个方法。

我有一个方法可以进行一些pandas.Timestamp()调用,其中一些包括pandas.Timestamp("now"). 这就是问题出现的地方。

当我修补pd.Timestamp时,除了“现在”之外,我还为 0-case 修补它。我怎样才能制作一个补丁,使其在pd.Timestamp所有其他情况下都正常运行pd.Timestamp("now")

我试图做一个side effect功能:

但似乎一旦pd.Timestamp被修补,这也被修补,所以我得到一个递归错误。

基本上,我想将返回值固定为pd.Timestamp("now")固定日期,而其他所有内容都正常解析。

编辑:在提问后对示例进行了更改。

0 投票
1 回答
498 浏览

stdout - 如何使用 unittest.mock.patch 函数创建一个吞噬 sys.stdout 的装饰器?

我正在尝试为我的单元测试测试函数创建一个 Python Mixin,返回值和sys.stdout. 我希望 Mixin 有一种方法可以作为装饰器来吞噬sys.stdout,但到目前为止我还没有成功。

我的自定义装饰器应该:

  • sys.stdout被测试函数产生的燕子
  • 使用unittest.mock.patch函数作为装饰器来实现
  • 不接受任何输入(保持代码干净)

我对装饰器的尝试:

测试功能示例:

在单元测试中期望使用装饰器:

正如预期的那样,我得到:

因为,我知道mock_stdout需要在那里,因为unittest.mock.patch装饰者需要。

0 投票
1 回答
3522 浏览

python - 在烧瓶和 pytest 中使用 500 状态码模拟响应

*已编辑*

我想测试如果外部 API 返回 500 状态码会发生什么。

我尝试了这段代码,但感觉像无头鸡:

也不HTTPError接受参数,我如何传递我想要 500 状态码的信息?

0 投票
0 回答
405 浏览

python - Python unittest.mock.patch 未按预期工作

我正在尝试测试我创建的向用户发送欢迎电子邮件的功能。但是,要做到这一点,我必须模拟实际发送它的函数(在欢迎电子邮件函数中)。我有以下文件夹结构:

这是我在mail.py中的代码

这是test_mail.py的代码,我正在尝试创建的测试:

参数user是我创建的一个夹具,它正在工作,所以不必担心。

使用pdb调试器,我检查了send_mail函数没有在send_sign_up_mail内部被模拟。