不可知地检查unittest.mock调用参数是否将其作为位置参数或关键字参数传递

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

from unittest.mock import Mock

m = Mock()  # creation of mock
m('foo', bar='baz')  # call to the mock
m.assert_called_once_with('foo', bar='baz')  # check call arguments

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

m.assert_called_once_with('foo', 'baz')
# AssertionError: Expected call: mock('foo', 'baz')
# Actual call: mock('foo', bar='baz')

它必须。如果该函数替换m

def actual_fu(foo, bar):
    # do something

则通话将是等效的,但如果是

def a_different_actual_fu(foo, *args, bar='some default'):
    # do something

则通话次数将不相等。Mock不知道实际函数的签名,因此它不能依赖于第一种情况下的等效性。

是否可以通过让Mock(或断言帮助器函数或类似函数)知道由模拟代替的实际函数,来检查与调用参数值是否位置传递或作为关键字参数无关的方法?

Mock对象可以知道它所取代的对象(可以是一个函数或方法)与可选的spec参数autospeccing,但那些用于不同的目的(限制什么叫以允许在模拟)和后不影响事实检查。

ec

可以使Mock对象知道它使用可选的spec参数或使用替换的对象(可以是函数或方法)autospeccing,但这些对象具有不同的用途。

这恰好是问题17015:模拟可以更智能,并检查有关规范的签名改进问题。spec实际上是有很大关系,现在做模拟功能签名感知。

看看当我们断言使用关键字参数调用mock时,mock如何失败-不让它知道实际的函数签名:

>>> from unittest.mock import Mock
>>>
>>> def actual_fu(foo, bar):
...     pass
>>>
>>> m = Mock()
>>> m('foo', bar='baz')
<Mock name='mock()' id='4356741496'>
>>>
>>> m.assert_called_once_with(foo='foo', bar='baz')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/unittest/mock.py", line 803, in assert_called_once_with
    return self.assert_called_with(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/unittest/mock.py", line 792, in assert_called_with
    raise AssertionError(_error_message()) from cause
AssertionError: Expected call: mock(bar='baz', foo='foo')
Actual call: mock('foo', bar='baz')

现在,看看如果我们提供,一切如何进行spec

>>> m = Mock(spec=actual_fu)
>>> m('foo', bar='baz')
<Mock name='mock()' id='4356249528'>
>>> 
>>> m.assert_called_once_with(foo='foo', bar='baz')
>>> m.assert_called_once_with('foo', bar='baz')
>>> m.assert_called_once_with(bar='baz', foo='foo')
>>> m.assert_called_once_with('foo', 'baz')
>>>

(使用Python 3.5.1)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

honeysql RDBMS是否不可知?

来自分类Dev

不可知方案/协议ajax调用

来自分类Dev

检查Julia中是否存在关键字参数

来自分类Dev

显示通用类型及其类型参数的语言不可知方式?

来自分类Dev

使用带有param关键字的通用委托参数检查是否为空

来自分类Dev

是否有任何与JPAv2兼容的供应商不可知的持久性API公开

来自分类Dev

在方法调用中通过位置和关键字传递参数“算法”

来自分类Dev

检查特定参数值是否作为kwargs传递的正确方法

来自分类Dev

检查文件(作为脚本的参数传递)是否为.iso类型

来自分类Dev

如何使用“ this”关键字作为参数?

来自分类Dev

通过Python关键字作为参数?

来自分类Dev

检查传递的参数是否存在

来自分类Dev

NoReverseMatch:关键字参数未传递

来自分类Dev

如何使RewriteRule子域不可知?

来自分类Dev

如何使perl单线“不可知的行尾”

来自分类Dev

在go中输入不可知的渠道

来自分类Dev

如何使方法流不可知?

来自分类Dev

如何使perl单线“不可知的行尾”

来自分类Dev

如何实现不可知的数据层?

来自分类Dev

如何使RewriteRule子域不可知?

来自分类Dev

functools.partial希望使用位置参数作为关键字参数

来自分类Dev

将关键字参数作为必需参数传递给Python

来自分类Dev

如何检查函数的参数并将其传递?

来自分类Dev

从argparse整齐地将位置参数作为args和可选参数作为kwargs从argparse传递给函数

来自分类Dev

Pyinstaller:SyntaxError:位置参数跟随关键字参数

来自分类Dev

CMocka:检查作为参数传递的结构

来自分类Dev

CMocka:检查作为参数传递的结构

来自分类Dev

如何将关键字作为可以传递给 update-in 的参数传递?

来自分类Dev

在将其传递给另一个可选参数之前是否有必要检查可选参数?

Related 相关文章

  1. 1

    honeysql RDBMS是否不可知?

  2. 2

    不可知方案/协议ajax调用

  3. 3

    检查Julia中是否存在关键字参数

  4. 4

    显示通用类型及其类型参数的语言不可知方式?

  5. 5

    使用带有param关键字的通用委托参数检查是否为空

  6. 6

    是否有任何与JPAv2兼容的供应商不可知的持久性API公开

  7. 7

    在方法调用中通过位置和关键字传递参数“算法”

  8. 8

    检查特定参数值是否作为kwargs传递的正确方法

  9. 9

    检查文件(作为脚本的参数传递)是否为.iso类型

  10. 10

    如何使用“ this”关键字作为参数?

  11. 11

    通过Python关键字作为参数?

  12. 12

    检查传递的参数是否存在

  13. 13

    NoReverseMatch:关键字参数未传递

  14. 14

    如何使RewriteRule子域不可知?

  15. 15

    如何使perl单线“不可知的行尾”

  16. 16

    在go中输入不可知的渠道

  17. 17

    如何使方法流不可知?

  18. 18

    如何使perl单线“不可知的行尾”

  19. 19

    如何实现不可知的数据层?

  20. 20

    如何使RewriteRule子域不可知?

  21. 21

    functools.partial希望使用位置参数作为关键字参数

  22. 22

    将关键字参数作为必需参数传递给Python

  23. 23

    如何检查函数的参数并将其传递?

  24. 24

    从argparse整齐地将位置参数作为args和可选参数作为kwargs从argparse传递给函数

  25. 25

    Pyinstaller:SyntaxError:位置参数跟随关键字参数

  26. 26

    CMocka:检查作为参数传递的结构

  27. 27

    CMocka:检查作为参数传递的结构

  28. 28

    如何将关键字作为可以传递给 update-in 的参数传递?

  29. 29

    在将其传递给另一个可选参数之前是否有必要检查可选参数?

热门标签

归档