0

I am trying to use a method as a spec_set on a MagicMock.

https://stackoverflow.com/a/25323517/11163122 provides a nice example of an unexpected call signature resulting in an Exception. Unfortunately, I can't get it to work out for a method.

How can I get the below code snippet to error out, given the calls don't match the spec?

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")

I am using Python 3.8+.

Intrastellar Explorer
  • 3,005
  • 9
  • 52
  • 119

1 Answers1

4

spec and spec_set are used for limiting the set of attributes a Mock is allowed to access. For functions, there's create_autospec.

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

Since bar is an instance method of Foo, you will also need to create an instance of Foo to get the expected function signature.

from unittest.mock import create_autospec

mocking_foo_bar = create_autospec(Foo().bar)

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

This raises an error:

TypeError: too many positional arguments
rchome
  • 2,623
  • 8
  • 21