在带有模拟函数的单元测试中,我不仅要验证参数的计数,而且还要验证这些参数是否符合已声明的autospec模拟函数类型。
下面是示例代码:
from unittest.mock import create_autospec
def foo(a: int, b: str):
return str(a) + b
mock_foo = create_autospec(foo)
foo = mock_foo # would be patched by e.g. @patch or monkeypatch fixture
foo(1, 2)
assert foo.called 此代码测试foo是否被正确调用。例如,这样的调用将失败:foo(1,2,3) --这包括参数的验证,但不包括它们的类型。有办法让autospec或其他函数来验证传递的参数类型吗?该信息可以在方法的签名中获得,因此我想我可以使用inspect模块编写这样的验证。但是有什么标准的吗?内置的还是图书馆的?
发布于 2022-09-06 13:20:02
可以通过在模拟中添加一个比较参数和注释的side_effect来解决这个问题:
from unittest.mock import create_autospec
def check_params(method):
def cp(*args, **kwargs):
for arg, typ in zip(args, method.__annotations__.values()):
assert isinstance(arg, typ)
for k, v in kwargs.values():
assert isinstance(v, method.__annotations__[k])
return cp
def foo(a: int, b: str):
return str(a) + b
mock_foo = create_autospec(foo)
mock_foo.side_effect=check_params(foo)
foo = mock_foo # would be patched by e.g. @patch or monkeypatch fixture
foo(1, 2)
assert foo.called 这将引发一个AssertionError,因为b应该是一个str,但是是一个int。
这也可以用于一个类:从unittest.mock导入create_autospec
def check_params(method):
def cp(*args, **kwargs):
for arg, typ in zip(args, method.__annotations__.values()):
assert isinstance(arg, typ)
for k, v in kwargs.values():
assert isinstance(v, method.__annotations__[k])
return cp
class Foo:
def foo(a: int, b: str):
return str(a) + b
mock_foo = create_autospec(Foo)
mock_foo.foo.side_effect=check_params(Foo.foo)
mock_foo.foo(1, 2)
assert mock_foo.foo.calledhttps://stackoverflow.com/questions/64919844
复制相似问题