Coder Social home page Coder Social logo

Spying on properties about pytest-mock HOT 5 OPEN

pytest-dev avatar pytest-dev commented on May 21, 2024 1
Spying on properties

from pytest-mock.

Comments (5)

fliiiix avatar fliiiix commented on May 21, 2024 12

Is there any progress?

from pytest-mock.

fogo avatar fogo commented on May 21, 2024 4

This a nice feature that I didn't even think about because I guess never really mocked a property before.

Below it is a draft I've come up in a hurry that is really buggy but get the basics done:

def spy(self, obj, name):
        if isinstance(getattr(obj, name), property):
            prop = getattr(obj, name)

            class SpyPropertyMock(mock_module.PropertyMock):

                def __get__(self, obj, obj_type):
                    self()
                    return prop.__get__(obj)

                def __set__(self, obj, val):
                    self(val)
                    prop.fset(obj, val)

            result = self.patch.object(obj, name, new_callable=SpyPropertyMock)
            return result
        else:
            method = getattr(obj, name)

            autospec = inspect.ismethod(method) or inspect.isfunction(method)
            # Can't use autospec classmethod or staticmethod objects
            # see: https://bugs.python.org/issue23078
            if inspect.isclass(obj):
                # bypass class descriptor:
                # http://stackoverflow.com/questions/14187973/python3-check-if-method-is-static
                value = obj.__getattribute__(obj, name)
                if isinstance(value, (classmethod, staticmethod)):
                    autospec = False

            result = self.patch.object(obj, name, side_effect=method,
                                       autospec=autospec)
            return result

A test using it:

def testFoo(mocker):
    mocked = mocker.spy(Foo, 'foo')

    foo = Foo()
    foo.foo = 'b'

    assert foo.foo == 'b'
    assert foo.foo != 'c'
    assert foo.foo != 'd'
    print mocked.mock_calls  #  [call(u'b'), call(), call(), call()]

With this, the mock object returned can be used to inspect mock_calls to property and property value is in fact changed.

Problems I've seen so far:

  • I'm unable to access Foo.foo without getting errors.
  • Different from method spies, object accessed by foo attr isn't a mock object, so it is only possible to access mock call objects through returned object.

Anyway I have to get more used to PropertyMock before moving on, let me know more details about your problems and implementation (maybe open a PR?) because I can try to help :)

from pytest-mock.

nicoddemus avatar nicoddemus commented on May 21, 2024

I'm not sure @blueyed... I think it would certainly be an useful feature. Do you have some sample code to share?

cc @fogo

from pytest-mock.

blueyed avatar blueyed commented on May 21, 2024

@nicoddemus
My idea was to first patch the class to allow setting a new attribute (using PropertyMock) and then patch the attribute itself.
But it felt like having to patch/use fget/fset from the property class itself.

from pytest-mock.

nicoddemus avatar nicoddemus commented on May 21, 2024

I don't think so, but I would be happy to review and merge a PR! 😁

from pytest-mock.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.