首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >模拟/ create_autospec:验证参数类型

模拟/ create_autospec:验证参数类型
EN

Stack Overflow用户
提问于 2020-11-19 20:55:20
回答 1查看 460关注 0票数 1

在带有模拟函数的单元测试中,我不仅要验证参数的计数,而且还要验证这些参数是否符合已声明的autospec模拟函数类型。

下面是示例代码:

代码语言:javascript
运行
复制
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模块编写这样的验证。但是有什么标准的吗?内置的还是图书馆的?

EN

回答 1

Stack Overflow用户

发布于 2022-09-06 13:20:02

可以通过在模拟中添加一个比较参数和注释的side_effect来解决这个问题:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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.called
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64919844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档