如何使用 MagicMock spec_set 或方法规范?

How to employ a MagicMock spec_set or spec on a method?

我正在尝试在 MagicMock 上使用一种方法作为 spec_set

提供了一个导致 Exception 的意外调用签名的很好示例。不幸的是,我无法通过某种方法解决它。

如果调用不符合规范,我怎样才能让下面的代码片段出错?

from unittest.mock import MagicMock

class Foo:
    def bar(self) -> None:
        """Some method I want to use as a spec."""

mocking_foo_bar_1 = MagicMock(name="with spec", spec=Foo.bar)
mocking_foo_bar_2 = MagicMock(name="with spec_set", spec_set=Foo.bar)

# These aren't raising, even though they don't match the spec
mocking_foo_bar_1("this", "should", "raise")
mocking_foo_bar_2("this", "also", "should", "raise")

我正在使用 Python 3.8+。

specspec_set用于限制允许Mock访问的属性集。对于函数,有 create_autospec.

Functions or methods being mocked will have their arguments checked to ensure that they are called with the correct signature.

由于 barFoo 的实例方法,您还需要创建 Foo 的实例以获得预期的函数签名。

from unittest.mock import create_autospec

mocking_foo_bar = create_autospec(Foo().bar)

mocking_foo_bar("this", "should", "raise")

这引发了一个错误:

TypeError: too many positional arguments