当前位置: 首页 > 面试题库 >

断言在Python单元测试中已调用方法

融宏伟
2023-03-14
问题内容

假设我在Python单元测试中具有以下代码:

aw = aps.Request("nv1")
aw2 = aps.Request("nv2", aw)

有没有一种简单的方法可以断言aw.Clear()在测试的第二行期间调用了特定方法(在我的情况下)?例如是否有这样的事情:

#pseudocode:
assertMethodIsCalled(aw.Clear, lambda: aps.Request("nv2", aw))

问题答案:

我为此使用Mock(在py3.3
+上现在是unittest.mock):

from mock import patch
from PyQt4 import Qt


@patch.object(Qt.QMessageBox, 'aboutQt')
def testShowAboutQt(self, mock):
    self.win.actionAboutQt.trigger()
    self.assertTrue(mock.called)

对于您的情况,它可能看起来像这样:

import mock
from mock import patch


def testClearWasCalled(self):
   aw = aps.Request("nv1")
   with patch.object(aw, 'Clear') as mock:
       aw2 = aps.Request("nv2", aw)

   mock.assert_called_with(42) # or mock.assert_called_once_with(42)

Mock支持许多有用的功能,包括修补对象或模块的方式以及检查是否调用了正确的东西等。

买者自负! (请当心!)

如果您输入错误的assert_called_with(到assert_called_onceassert_called_wiht)您的测试可能仍在运行,因为Mock会认为这是一个模拟的函数并且很乐意进行,除非您使用autospec=true。有关更多信息,请阅读assert_call_once:Threat或Menace。



 类似资料:
  • 问题内容: 我有一个Python 2.7方法,有时会调用 当满足正确的条件时,是否可以进行单元测试以验证是否调用了此代码行? 问题答案: 是。加注,因此您可以使用以下命令进行检查: 的实例具有设置为建议的退出状态的属性,并且返回的上下文管理器将捕获的异常实例设置为,因此检查退出状态很容易: sys.exit文档: 从Python退出。这是通过引发异常来实现的…可以在外部级别拦截出口尝试。

  • 问题内容: 我需要创建一个伪的帮助程序类以用于单元测试(注入到测试的类中)。有没有办法在此类中使用TestCase断言? 我想将这些断言用于Fake类执行的一些常见检查。就像是: 问题答案: 您可以创建的实例并在其上调用方法。 在较旧的Python版本(Python 2.7和更早的版本3.0、3.1)上,您需要在类类中传递 现有 方法的名称(通常在子类上传递测试方法的名称)。在这种情况下将: 但是

  • 玩弄Mockito来实现我的服务的单元测试,但由于某种原因,我无法通过我的厚脑袋来实现这一点。我的考试通过了,但我不能确信我做得对。 下面是一个测试count()方法的示例。该方法只是将调用转发到它的存储库,我不想验证仅此而已,没有其他事情发生。这就是我得到的: 我的考试及格了,但我有一些问题。 > 我需要验证吗?我觉得我这样做是因为我想验证personRepository。实际上调用了count

  • 我正在使用spock测试Java Spring Boot代码。它在lombok@slf4j注释上获得一个日志记录器。 具有日志调用的虚拟类 斯波克规格 用模拟记录器从这个答案切换真实的帮助器。 我想测试日志调用,但仍然看到日志消息。 我提出了这个解决方案,它使用groovy规范的记录器进行调用。 但是我发现它很冗长,不管我如何为它创建一个帮助器函数。我不是很熟悉函数groovy,将此代码移到函数中

  • 如果它没有返回任何东西,是否可能以某种方式测试它是否停止了这个if语句?我的意思是,我想把某种断言,检查“好吧,上下文是空的,所以它在这个返回时停止了”。 当然,问题是类是空的,为什么我想测试这种方法可能会有问题,但我想听听一些可能性。

  • 我正在阅读使用Assertj验证结果的测试类。偶尔,我会发现一个没有断言的断言。 是否有可能在开发周期的某个地方识别这些类?我的第一个猜测是使用自定义声纳规则。虽然我不明白应该如何定义这个方法后面应该跟一个断言(返回void的方法?)。