当前位置: 首页 > 知识库问答 >
问题:

检查函数是否被不同参数多次调用

潘安平
2023-03-14

假设我们有一个函数f(x, y)和另一个函数

def g():
       # ...
       f(i,j) # i,j vary and f is called multiple times
       # ...

我们希望编写一个Unit测试,检查是否调用了f的次数和正确的参数。

def test_g():
      with patch('mymodule.f') as function:
          assert function.gacs.call_count == correct_no_calls

那里有

function.assert_called_with(...)

但这只是指最后一次通话。所以假设g调用f(1,2),然后f(2,3)函数。用(1,2)调用的断言是False

此外,还有

function.call_args_list

这将生成一个包含正确参数的调用对象列表。将这个列表与我们在单元测试中创建的call对象进行比较,感觉是一件非常讨厌的事情<代码>调用似乎是模拟库的一个内部类。

有更好的方法吗?我使用这个设置来测试apply函数的并行执行。

共有2个答案

鲍高扬
2023-03-14

测试Mock()。mock_calls列表等于您提供的mock.call()对象列表:

self.assertEquals(function.mock_calls, [
    mock.call(1, 2),
    mock.call(2, 3),
])

这将为您提供精确的控制,需要同时匹配呼叫的顺序和数量。

mock。call()类不是内部的,它用于类似这样的断言。

卢文博
2023-03-14

即使@MartinPieters的答案是正确的,我认为这不是最好的方法。Mock-provideassert_有_调用来完成这种任务。

你的测试可能是:

function.assert_has_calls([mock.call(1, 2), mock.call(2, 3)])

其中mock。call是一个帮助类,用于处理此类工作。

注意,这是一个has呼叫,意味着呼叫列表应该在呼叫列表中,而不是相等的。为了解决这个问题,我通常定义自己的助手assert\u is\u calls(),如下所示

def assert_is_calls(m, calls, any_order=False):
   assert len(m.mock_calls) == len(calls)
   m.assert_has_calls(calls, any_order=any_order)

这是一个简历的例子

>>> import mock
>>> f = mock.Mock()
>>> f(1)
<Mock name='mock()' id='139836302999952'>
>>> f(2)
<Mock name='mock()' id='139836302999952'>
>>> f.assert_has_calls([mock.call(1), mock.call(2)])
>>> f.assert_has_calls([mock.call(2), mock.call(1)])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/damico/.local/lib/python2.7/site-packages/mock/mock.py", line 969, in assert_has_calls
    ), cause)
  File "/home/damico/.local/lib/python2.7/site-packages/six.py", line 718, in raise_from
    raise value
AssertionError: Calls not found.
Expected: [call(2), call(1)]
Actual: [call(1), call(2)]
>>> f.assert_has_calls([mock.call(2), mock.call(1)], any_order=True)
>>> f(3)
<Mock name='mock()' id='139836302999952'>
>>> f.assert_has_calls([mock.call(2), mock.call(1)], any_order=True)
>>> f.assert_has_calls([mock.call(1), mock.call(2)])
>>> assert len(f.mock_calls)==2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError
>>> assert len(f.mock_calls)==3
>>> def assert_is_calls(m, calls, any_order=False):
...    assert len(m.mock_calls) == len(calls)
...    m.assert_has_calls(calls, any_order=any_order)
... 
>>> assert_is_calls(f, [mock.call(1), mock.call(2), mock.call(3)])
>>> assert_is_calls(f, [mock.call(1), mock.call(3), mock.call(2)])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in assert_is_calls
  File "/home/damico/.local/lib/python2.7/site-packages/mock/mock.py", line 969, in assert_has_calls
    ), cause)
  File "/home/damico/.local/lib/python2.7/site-packages/six.py", line 718, in raise_from
    raise value
AssertionError: Calls not found.
Expected: [call(1), call(3), call(2)]
Actual: [call(1), call(2), call(3)]
>>> assert_is_calls(f, [mock.call(1), mock.call(3), mock.call(2)], True)
>>> assert_is_calls(f, [mock.call(1), mock.call(3)], True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in assert_is_calls
AssertionError
>>> 
 类似资料:
  • 当我多次调用同一个函数时,每次都传递了不同的参数,我会这样做: 有没有更方便的方法做到这一点呢?

  • 问题内容: 我知道,在Python中通常不赞成使用类型检查函数参数,但我认为这样做很有意义。 在我的项目中,我有一个抽象基类和一个子类,该子类具有更多功能,例如旋转,幅度变化等。数字的列表和元组也将返回True,因为我也有许多接受这些Coord类型作为参数的函数和方法。 。我已经设置了装饰器来检查这些方法的参数。这是一个简化的版本: 这个版本非常简单,仍然有一些错误。只是为了说明这一点。它的用法如

  • 我正在使用一个调用函数的API开发一个web服务器。这个函数的任务很繁重,并且会缓存结果。我的设计方式是,如果没有缓存,并且多个用户同时使用相同的参数调用此API,服务器只为第一个请求调用该函数一次,所有其他请求等待完成作业并从缓存返回响应。 我用这种方式写了一个测试: 我可以通过在这个沉重的函数中打印一个值来检查我的代码是否正常工作,并检查控制台,看看它是否只出现一次,但是如果这个函数被调用了更

  • 我正在使用Jest测试一些实用函数。 my_util.js: 另一个例子。js: 测试调用了的最简单方法是什么?这是我当前的单元测试,它失败了。有没有一种方法可以测试函数是否以其名称调用? 结果:

  • 问题内容: 我正在用Python编程,我想知道是否可以测试代码中是否已调用函数 我该怎么做? 问题答案: 如果该函数知道其自己的名称是可以的,则可以使用function属性: 您还可以使用装饰器设置属性:

  • this.aesFn(this.form.sourceParam) this.sourceDrop[this.indexw].datasource,